JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。
解析JSON字符串
1.
cJSON_Parse函数
:负责解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。使用该函数会通过malloc函数在内存中开辟一个空间,使用完成需要手动释放。
我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。
2.
cJSON_GetObjectItem函数
:可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
3.如果需要使用cJSON结构体中的内容,可通过cJSON结构体中的valueint和valuestring取出有价值的内容(即键的值)
4.可通过cJSON_Delete释放内存空间。
例程
本例程为初级篇,输出到屏幕的同时,从json字符串中获取相对应的键值,生成对应的test.json文件中。
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
char *target="{\"name\":\"xiaoming\",\"nameid\":\"1\",\"age\":20}";
int json_analyse(char *tar)
{
if(tar == NULL)
{
printf("json_analyse tar error!\n");
return -1;
}
cJSON *json,*json_name,*json_nameid,*json_age;
char *buf = NULL;
//从缓冲区中解析出JSON结构
json = cJSON_Parse(tar);
if(!json)
{
printf("get json error!\n");
return -1;
}
//将json结构格式化到缓冲区
buf = cJSON_Print(json);
//cJOSN_GetObjectItem 根据key来查找json节点 若果有返回非
json_name = cJSON_GetObjectItem(json,"name");
if(!json_name)
{
printf("get json_name error!\n");
return -1;
}
json_nameid = cJSON_GetObjectItem(json,"nameid");
if(!json_nameid)
{
printf("get json_nameid error!\n");
return -1;
}
json_age = cJSON_GetObjectItem(json,"age");
if(!json_age)
{
printf("get json_age error!\n");
return -1;
}
printf("name type:%d,name:%s\n",json_name->type,json_name->valuestring);
printf("nameid type:%d,nameid:%s\n",json_nameid->type,json_nameid->valuestring);
printf("age type:%d,age:%d\n",json_age->type,json_age->valueint);
printf("name:%s,nameid:%s,num:%d\n",json_name->valuestring,json_nameid->valuestring,json_age->valueint);
//打开一个test.json文件,并写入json内容
FILE *fp = fopen("test.json","w");
fwrite(buf,strlen(buf),1,fp);
free(buf);
fclose(fp);
// 释放内存
cJSON_Delete(json);
return 1;
}
int main(int argc, char **argv)
{
int val = 0;
val = json_analyse(target);
if(1 != val)
{
printf("json_analyse error!\n");
return -1;
}
return 0;
}
运行该例程的结果
版权声明:本文为m0_38022615原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。