• 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
    ",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;
    }
    
    

    执行结果如下图:

  • 相关阅读:
    maven引入tomcat插件
    Maven更新jdk1.7
    ehcashe
    response的json
    ajax
    180411
    清空select标签中option选项
    jackson
    ajax
    mysql主从
  • 原文地址:https://www.cnblogs.com/zhengkang/p/9356577.html
Copyright © 2020-2023  润新知