cJSON使用入门

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\n",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\t",name->valuestring);	
	if(id && id->type==cJSON_Number)
		printf("%d\n",id->valueint);
	//printf("%s\n",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\n",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\t",name->valuestring);
			if(id && id->type == cJSON_Number)
				printf("%d\t",id->valueint);
			if(chinese && chinese->type == cJSON_Number)
				printf("%d\n",chinese->valueint);
		}
	}
	cJSON_Delete(temp);
	return 0;
}

执行结果如下图:

posted @ 2018-07-23 20:06  zkang  阅读(726)  评论(0编辑  收藏  举报