cJSON 接收例子

cJSON 是一个轻量级的 JSON 解析库,使用 C 语言实现,它非常适用于嵌入式系统和需要高效处理 JSON 数据的场景,本文将详细介绍如何使用 cJSON 进行 JSON 数据的接收和解析,并提供相关示例代码。
cJSON 基本概念
在开始之前,我们需要了解一些关于 cJSON 的基本概念:
1、cJSON 类型:cJSON 支持多种数据类型,包括逻辑值、null、数字、字符串、数组和对象。
2、cJSON 结构体:cJSON 使用结构体来表示 JSON 数据,每个节点由cJSON 结构体组成,包含类型、值以及指向子节点的指针。
3、cJSON 函数:常用的 cJSON 函数包括cJSON_Parse(解析 JSON 字符串)、cJSON_GetObjectItem(获取对象项)、cJSON_Delete(删除 cJSON 对象)等。
JSON 数据格式
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以键值对的形式存在,以下是一些常见的 JSON 数据类型:
逻辑值:如true 或false
null

数字:整数或浮点数
字符串:用双引号括起来
数组:用中括号[] 包含多个值
对象:用大括号{} 包含多个键值对
cJSON 接收和解析示例
示例 1:解析简单的 JSON 字符串
下面是一个简单的示例,演示如何使用 cJSON 解析一个简单的 JSON 字符串。
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
int main() {
char jsonData[] = "{\"name\":\"C Primer pluse\",\"pages\":626}";
// 解析 JSON 字符串
cJSON *srcJsonData = cJSON_Parse(jsonData);
if (!srcJsonData) {
printf("Error before: [%s]
", cJSON_GetErrorPtr());
return -1;
}
// 获取并打印 JSON 数据的内容
cJSON *value;
value = cJSON_GetObjectItem(srcJsonData, "name");
if (value->type == cJSON_String) {
printf("书名:%s
", value->valuestring);
}
value = cJSON_GetObjectItem(srcJsonData, "pages");
if (value->type == cJSON_Number) {
printf("页数:%d
", value->valueint);
}
// 释放 JSON 对象的内存
cJSON_Delete(srcJsonData);
return 0;
}运行结果:
书名:C Primer pluse 页数:626
示例 2:解析复杂的 JSON 文件

当 JSON 数据较大时,通常使用文件保存 JSON 数据,下面是一个示例,演示如何从文件中读取并解析 JSON 数据。
假设有一个名为data.txt 的文件,内容如下:
{
"class": "C语言书籍",
"books": [
{
"name": "C Primer pluse",
"author": "Stephen Prata",
"publishing": "人民邮电出版社"
},
{
"name": "C程序设计",
"author": "谭浩强",
"publishing": "清华大学出版社"
},
{
"name": "C陷阱与缺陷",
"author": "Andrew Koenig",
"publishing": "人民邮电出版社"
}
]
}解析该文件的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
int main() {
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
perror("Failed to open file");
return -1;
}
// 获取文件大小
fseek(fp, 0, SEEK_END);
long length = ftell(fp);
fseek(fp, 0, SEEK_SET);
// 分配内存并读取文件内容
char *data = (char *)malloc(length + 1);
fread(data, 1, length, fp);
data[length] = '\0';
fclose(fp);
// 解析 JSON 数据
cJSON *root = cJSON_Parse(data);
if (!root) {
printf("Error before: [%s]
", cJSON_GetErrorPtr());
free(data);
return -1;
}
// 获取并打印 class 的值
cJSON *value = cJSON_GetObjectItem(root, "class");
if (value->type == cJSON_String) {
printf("类别:%s
", value->valuestring);
}
// 获取并打印 books 数组中的每一项
cJSON *books = cJSON_GetObjectItem(root, "books");
if (books && books->type == cJSON_Array) {
int numBooks = cJSON_GetArraySize(books);
for (int i = 0; i < numBooks; i++) {
cJSON *book = cJSON_GetArrayItem(books, i);
cJSON *name = cJSON_GetObjectItem(book, "name");
cJSON *author = cJSON_GetObjectItem(book, "author");
cJSON *publishing = cJSON_GetObjectItem(book, "publishing");
if (name && author && publishing) {
printf("书名:%s, 作者:%s, 出版社:%s
", name->valuestring, author->valuestring, publishing->valuestring);
}
}
}
// 释放 JSON 对象的内存
cJSON_Delete(root);
free(data);
return 0;
}运行结果:
类别:C语言书籍 书名:C Primer pluse, 作者:Stephen Prata, 出版社:人民邮电出版社 书名:C程序设计, 作者:谭浩强, 出版社:清华大学出版社 书名:C陷阱与缺陷, 作者:Andrew Koenig, 出版社:人民邮电出版社
通过上述两个示例,我们展示了如何使用 cJSON 解析简单的 JSON 字符串和复杂的 JSON 文件,cJSON 提供了简洁易用的 API,使得在 C 语言中处理 JSON 数据变得非常方便,无论是简单的键值对还是复杂的嵌套结构,cJSON 都能轻松应对。
各位小伙伴们,我刚刚为大家分享了有关“cjson 接收例子”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/47686.html<





