源码地址https://download.csdn.net/download/qq_53683175/88956229
1. 介绍
cJSON 一个基于 C 语言的 Json 库,它是一个开源项目,便于开发和移植。
2.创建和解析一个简单的 JSON 数据
2.1 创建 一个简单的 JSON 数据
创建一个如下的JSON数据:
{
"name":"杨过",
"year":999,
"isMan":true,
"height":180.99
}
源码:
int main()
{
//1. 创建cJSON对象
cJSON *jsonData = cJSON_CreateObject();
//2. 创建数据
cJSON_AddStringToObject(jsonData, "name","杨过");
cJSON_AddNumberToObject(jsonData,"year",666);
cJSON_AddBoolToObject(jsonData, "isMan", cJSON_True);
cJSON_AddNumberToObject(jsonData, "heigh", 180.99);
//3. 打印生成的结果
char *data = cJSON_PrintUnformatted(jsonData);
printf("%s\r\n",data);
data = cJSON_Print(jsonData);
printf("\r\n%s\r\n",data);
//4. 释放空间
cJSON_Delete(jsonData);
return 0;
}
测试结果:
2.2 解析 一个简单的SON 数据
源码:
int main()
{
char data[] = "{\"name\":\"杨过\",\"year\":666,\"isMan\":true,\"heigh\":180.99}";
//1. 载入JSON数据
cJSON* jsonData = cJSON_Parse(data);
if (jsonData == NULL)
return 0;
//2. 解析字段
cJSON* item;
item = cJSON_GetObjectItem(jsonData,"name");
if (item)
{
printf("name = %s\n", item->valuestring);
}
item = cJSON_GetObjectItem(jsonData, "year");
if (item)
{
printf("year = %d\n", item->valueint);
}
item = cJSON_GetObjectItem(jsonData, "isMan");
if (item)
{
printf("isMan = %d\n", item->valueint);
}
item = cJSON_GetObjectItem(jsonData, "heigh");
if (item)
{
printf("heigh = %lf\n", item->valuedouble);
}
//3. 释放空间
cJSON_Delete(jsonData);
return 0;
}
测试结果:
3. 创建和解析具有多个对象的 JSON 数据
3.1 创建具有多个对象的 JSON 数据
创建如下一个 JSON 数据
{
"male": {
"name":"杨过",
"year":999
},
"female": {
"name":"小龙女",
"year":666
}
}
源码:
int main()
{
//1. 创建cJSON对象
cJSON *jsonData = cJSON_CreateObject();
//2.1 创建数据 male
cJSON* male = cJSON_CreateObject();
cJSON_AddStringToObject(male, "name","杨过");
cJSON_AddNumberToObject(male,"year",999);
cJSON_AddItemToObject(jsonData, "male", male);
//2.2 创建数据 female
cJSON* female = cJSON_CreateObject();
cJSON_AddStringToObject(female, "name","小龙女");
cJSON_AddNumberToObject(female,"year",666);
cJSON_AddItemToObject(jsonData, "female", female);
//3. 打印生成的结果
char *data = cJSON_PrintUnformatted(jsonData);
printf("%s\r\n",data);
data = cJSON_Print(jsonData);
printf("\r\n%s\r\n",data);
//4. 释放空间
cJSON_Delete(jsonData);
return 0;
}
测试结果:
3.2 解析具有多个对象的 JSON 数据
源码:
int main()
{
char data[] = "{\"male\":{\"name\":\"杨过\",\"year\":999},\"female\":{\"name\":\"小龙女\",\"year\":666}}";
//1. 载入JSON数据
cJSON* jsonData = cJSON_Parse(data);
if (jsonData == NULL)
return 0;
//2. 解析字段
cJSON* item;
item = cJSON_GetObjectItem(jsonData, "male");
if (item){
cJSON *obj = cJSON_GetObjectItem(item, "name");
if (obj){
printf("male.name = %s\n", obj->valuestring);
}
obj = cJSON_GetObjectItem(item, "year");
if (obj)
{
printf("male.year = %d\n", obj->valueint);
}
}
item = cJSON_GetObjectItem(jsonData, "female");
if (item){
cJSON *obj = cJSON_GetObjectItem(item, "name");
if (obj){
printf("female.name = %s\n", obj->valuestring);
}
obj = cJSON_GetObjectItem(item, "year");
if (obj)
{
printf("female.year = %d\n", obj->valueint);
}
}
//3. 释放空间
cJSON_Delete(jsonData);
return 0;
}
测试结果:
4. 创建和解析具有数组的 JSON 数据
4.1 创建具有数组的 JSON 数据
创建如下一个 JSON 数据
{
"player": [
{
"name":"杨过",
"year":999
},
{
"name":"小龙女",
"year":666
},
{
"name":"郭靖",
"year":333
}
]
}
源码:
typedef struct _Players{
char Name[10];
int year;
}Players;
int main()
{
Players players[3] = {
{"杨过", 999},
{"小龙女", 666},
{"郭靖", 333}
};
//1. 创建cJSON对象
cJSON *jsonData = cJSON_CreateObject();
//2. 创建数组对象
cJSON *player = cJSON_CreateArray();
cJSON_AddItemToObject(jsonData, "player", player);
for(int i=0; i<3 ; i++){
cJSON *obj = cJSON_CreateObject();
cJSON_AddItemToArray(player, obj);
cJSON *name = cJSON_CreateString(players[i].Name);
cJSON_AddItemToObject(obj, "name", name);
cJSON *year = cJSON_CreateNumber(players[i].year);
cJSON_AddItemToObject(obj, "year", year);
}
//3. 打印生成的结果
char *data = cJSON_PrintUnformatted(jsonData);
printf("%s\r\n",data);
data = cJSON_Print(jsonData);
printf("\r\n%s\r\n",data);
//4. 释放空间
cJSON_Delete(jsonData);
return 0;
}
测试结果:
4.2 解析具有数组的 JSON 数据
源码:
int main()
{
char data[] = "{\"player\":[{\"name\":\"杨过\",\"year\":999},{\"name\":\"小龙女\",\"year\":666},{\"name\":\"郭靖\",\"year\":333}]}";
//1. 载入JSON数据
cJSON* jsonData = cJSON_Parse(data);
if (jsonData == NULL)
return 0;
//2. 解析字段
cJSON* player = cJSON_GetObjectItem(jsonData, "player");
if (player){
//2.1 获取数组的大小
int Size = cJSON_GetArraySize(player);
//2.2 解析数组的里的每个成员
for (int i = 0; i < Size; i++){
// 取出数组下标对象
cJSON *array_item = cJSON_GetArrayItem(player, i);
if (array_item == NULL)continue;
// 解析数据
cJSON *obj = cJSON_GetObjectItem(array_item, "name");
if (obj){
printf("player[%d].name = %s\n", i, obj->valuestring);
}
obj = cJSON_GetObjectItem(array_item, "year");
if (obj){
printf("player[%d].year = %d\n", i, obj->valueint);
}
}
}
//3. 释放空间
cJSON_Delete(jsonData);
return 0;
}
测试结果: