json数据解析
1.json格式
首先简单介绍下啥是json格式。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
cJSON从名字可知,整个项目都是以极标准的C来写的,意思说,可以跨各种平台使用了。cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
cJSON,就只有两个文件,一个cJSON.c 一个cJSON.h文件。使用的时候,自己创建好一个main.c文件后,将头文件include进去。
cjson下载地址
2.cjson结构体
typedef struct cJSON {
struct cJSON *next,*prev;
struct cJSON *child;
int type;
char *valuestring;
int valueint;
double valuedouble;
char *string;
} cJSON;
几点说明
1.cJSON是使用链表来存储数据的,其访问方式很像一颗树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有子节点。
2.type是键(key)的类型,一共有7种取值,分别是:False,Ture,NULL,Number,String,Array,Object。
若是Number类型,则valueint或valuedouble中存储着值。若期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值。
若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。
3、string中存放的是这个节点的名字,可理解为key的名称。
3.解析json格式
假设有这样一个字符串需要解析,那么我们只需要调用cJSON*cJSON_Parse(const char *value)即可
{"name":"xiaoming","ID":20180723,"score":{"math":80,"English":92.5,"Chinese":90}}
程序代码:
#include<stdio.h>
#include "cJSON.h"
int main()
{
char *p="{"name":"xiaoming","ID":20180723,"score":{"math":80,"English":92.5,"Chinese":90}}";
cJSON* temp ;
temp=cJSON_Parse(p);
char* c=cJSON_Print(temp);
printf("%s
",c);
cJSON_Delete(temp);
return 0;
}
执行结果如图:
如果我们只想查询小明的姓名和ID,我们可以这样做
int main()
{
char *p="{"name":"xiaoming","ID":20180723,"score":{"math":80,"English":92.5,"Chinese":90}}";
cJSON *temp,*name,*id ;
temp=cJSON_Parse(p);
char* c=cJSON_Print(temp);
name = cJSON_GetObjectItem(temp,"name");//
id = cJSON_GetObjectItem(temp,"ID");
if(name && name->type==cJSON_String)
printf("%s ",name->valuestring);
if(id && id->type==cJSON_Number)
printf("%d
",id->valueint);
//printf("%s
",c);
cJSON_Delete(temp);
return 0;
}
GetObjectItem函数原型为
extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
获取object中名为*string的对象,返回指针
4.解析结构体数组
假设需要解析的字符串如下:
char *p="{"stu":[{"name":"xiaoming","ID":20180723,"score":{"math":80,"English":92.5,"Chinese":90}},{"name":"xiaohong","ID":20180724,"score":{"math":70,"English":80,"Chinese":95}}]}";
解析程序如下:
#include<stdio.h>
#include "cJSON.h"
int main()
{
char *p="{"stu":[{"name":"xiaoming","ID":20180723,"score":{"math":80,"English":92.5,"Chinese":90}},{"name":"xiaohong","ID":20180724,"score":{"math":70,"English":80,"Chinese":95}}]}";
int size,i;
cJSON *temp,*name,*id,*stu, *temp1,*score,*chinese;
temp=cJSON_Parse(p);
char* c=cJSON_Print(temp);
printf("%s
",c);
stu = cJSON_GetObjectItem(temp,"stu");
if(stu && stu->type==cJSON_Array)
{
size = cJSON_GetArraySize(stu);
for(i=0;i<size;i++)
{
temp1 = cJSON_GetArrayItem(stu,i);
name= cJSON_GetObjectItem(temp1,"name");
id = cJSON_GetObjectItem(temp1,"ID");
score=cJSON_GetObjectItem(temp1,"score");
if(score && score->type==cJSON_Object)
chinese = cJSON_GetObjectItem(score,"chinese");
if(name && name->type == cJSON_String)
printf("%s ",name->valuestring);
if(id && id->type == cJSON_Number)
printf("%d ",id->valueint);
if(chinese && chinese->type == cJSON_Number)
printf("%d
",chinese->valueint);
}
}
cJSON_Delete(temp);
return 0;
}
执行结果如下图: