CJSON 实例

来源:互联网 发布:部落冲突数据大全2017 编辑:程序博客网 时间:2024/04/28 13:07

 

cJSON:  一个用c写的一个简单好用的JSON解析器

cJSON库


1、json的数据结构 


c语言中json数据是采用链表存储的 

typedef struct cJSON {   

    struct cJSON *next,*prev;// 数组 对象数据中用到   

    struct cJSON *child;// 数组 和对象中指向子数组对象或值   

    int type;// 元素的类型,如是对象还是数组   

    char *valuestring;// 如果是字符串   

    int valueint; // 如果是数值   

    double valuedouble;// 如果类型是cJSON_Number   

    char *string;// The item's name string, if this item is the child of, or is in the list of subitems of an object.   

} cJSON; 


cJSON使用

{   

    "name": "Jack (\"Bee\") Nimble",    

    "format": {   

        "type":       "rect",    

        "width":      1920,    

        "height":     1080,    

        "interlace":  false,    

        "frame rate": 24   

    }   

  

1、字符串解析成json结构体

1):字符串解析成json结构体。 

cJSON *root = cJSON_Parse(my_json_string); 


2):获取某个元素  

cJSON *format = cJSON_GetObjectItem(root,"format");   

int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint; 

int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;


3):讲json结构体转换成字符串 

char *rendered=cJSON_Print(root); 


4):删除 

cJSON_Delete(root); 


2:构建一个json结构体  

cJSON *root,*fmt;   

root=cJSON_CreateObject();     

cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));   

cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());   

cJSON_AddStringToObject(fmt,"type",     "rect");   

cJSON_AddNumberToObject(fmt,"width",        1920);   

cJSON_AddNumberToObject(fmt,"height",       1080);   

cJSON_AddFalseToObject (fmt,"interlace");   

cJSON_AddNumberToObject(fmt,"frame rate",   24)

out =cJSON_Print(root);

printf("%s\n",out); 

cJSON_Delete(root);

free(out);



 

 

 

本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据。2)创建json数组和解析json数组

 

1、 创建json,从json中获取数据

  1 #include <stdio.h>                                                                                              2 #include "cJSON.h"  3   4 char * makeJson()  5 {  6     cJSON * pJsonRoot = NULL;  7   8     pJsonRoot = cJSON_CreateObject();  9     if(NULL == pJsonRoot) 10     { 11         //error happend here 12         return NULL; 13     } 14     cJSON_AddStringToObject(pJsonRoot, "hello", "hello world"); 15     cJSON_AddNumberToObject(pJsonRoot, "number", 10010); 16     cJSON_AddBoolToObject(pJsonRoot, "bool", 1); 17     cJSON * pSubJson = NULL; 18     pSubJson = cJSON_CreateObject(); 19     if(NULL == pSubJson) 20     { 21         // create object faild, exit 22         cJSON_Delete(pJsonRoot); 23         return NULL; 24     } 25     cJSON_AddStringToObject(pSubJson, "subjsonobj", "a sub json string"); 26     cJSON_AddItemToObject(pJsonRoot, "subobj", pSubJson); 27  28     char * p = cJSON_Print(pJsonRoot); 29   // else use :  30     // char * p = cJSON_PrintUnformatted(pJsonRoot); 31     if(NULL == p) 32     { 33         //convert json list to string faild, exit 34         //because sub json pSubJson han been add to pJsonRoot, so just delete pJsonRoot, if you also delete pSubJson, it will coredump, and error is : double free 35         cJSON_Delete(pJsonRoot); 36         return NULL; 37     } 38     //free(p); 39      40     cJSON_Delete(pJsonRoot); 41  42     return p; 43 } 44  45 void parseJson(char * pMsg) 46 { 47     if(NULL == pMsg) 48     { 49         return; 50     } 51     cJSON * pJson = cJSON_Parse(pMsg); 52     if(NULL == pJson)                                                                                          53     { 54         // parse faild, return 55       return ; 56     } 57  58     // get string from json 59     cJSON * pSub = cJSON_GetObjectItem(pJson, "hello"); 60     if(NULL == pSub) 61     { 62         //get object named "hello" faild 63     } 64     printf("obj_1 : %s\n", pSub->valuestring); 65  66     // get number from json 67     pSub = cJSON_GetObjectItem(pJson, "number"); 68     if(NULL == pSub) 69     { 70         //get number from json faild 71     } 72     printf("obj_2 : %d\n", pSub->valueint); 73  74     // get bool from json 75     pSub = cJSON_GetObjectItem(pJson, "bool"); 76     if(NULL == pSub) 77     { 78         // get bool from json faild 79     }                                                                                                          80     printf("obj_3 : %d\n", pSub->valueint); 81  82  // get sub object 83     pSub = cJSON_GetObjectItem(pJson, "subobj"); 84     if(NULL == pSub) 85     { 86         // get sub object faild 87     } 88     cJSON * pSubSub = cJSON_GetObjectItem(pSub, "subjsonobj"); 89     if(NULL == pSubSub) 90     { 91         // get object from subject object faild 92     } 93     printf("sub_obj_1 : %s\n", pSubSub->valuestring); 94  95     cJSON_Delete(pJson); 96 } 97  98 int main() 99 {100     char * p = makeJson();101     if(NULL == p)102     {103         return 0;104     }105     printf("%s\n", p);106     parseJson(p);                                                                                             107   free(p);  //千万不要忘记释放内存呀,cJSON_Print()函数或者cJSON_PrintUnformatted()产生的内存,使用free(char *)进行释放108     return 0;109 }

  

centos下编译通过,运行结果如下

 1 { 2     "hello":    "hello world", 3     "number":    10010, 4     "bool":    true, 5     "subobj":    { 6         "subjsonobj":    "a sub json string" 7     } 8 } 9 obj_1 : hello world10 obj_2 : 1001011 obj_3 : 112 sub_obj_1 : a sub json string

代码解释如下:

CJSON在内存中的存储方式是用链表进行存储的,所以在进行操作的时候,我们可见的部分全部是用指针进行操作的。

第8行新建一个JSON项目。

第14、15、16行分别添加了字符串、数字和bool变量。

第18行新建一个JSON项目:pSubJson。

第25行在新建的pSubJson项目上添加字符串。

第26行把我们的新项目添加到最初的项目pJsonRoot上。

第28行把CJSON的内存的存储的数据转换为字符串格式。

cjson库的 百度网盘 下载地址在:http://pan.baidu.com/s/1ntsRLgt

 

结果分析:

第1到8行为创建的JSON字符串

第9到12行为从JSON解析得到的数据

 

2、创建json数组和解析json数组

 1 //创建数组,数组值是另一个JSON的item,这里使用数字作为演示 2 char * makeArray(int iSize) 3 { 4     cJSON * root =  cJSON_CreateArray();                                                              5     if(NULL == root) 6     { 7         printf("create json array faild\n"); 8         return NULL; 9     }10     int i = 0;11     12     for(i = 0; i < iSize; i++)13     {14         cJSON_AddNumberToObject(root, "hehe", i);15     }16     char * out = cJSON_Print(root);17     cJSON_Delete(root);18 19     return out;20 }21 22 //解析刚刚的CJSON数组23 void parseArray(char * pJson)24 {25     if(NULL == pJson)26     {                                                                                                27         return ;28     }29     cJSON * root = NULL;30     if((root = cJSON_Parse(pJson)) == NULL)31     {32         return ;33     }34     int iSize = cJSON_GetArraySize(root);35     for(int iCnt = 0; iCnt < iSize; iCnt++)36     {37         cJSON * pSub = cJSON_GetArrayItem(root, iCnt);38         if(NULL == pSub)39         {40             continue;41         }42         int iValue = pSub->valueint;43         printf("value[%2d] : [%d]\n", iCnt, iValue);44     }   45     cJSON_Delete(root);46     return;47 }

输出结果

1)创建JSON数组

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2)解析数组的输出结果

value[ 0] : [0]value[ 1] : [1]value[ 2] : [2]value[ 3] : [3]value[ 4] : [4]value[ 5] : [5]value[ 6] : [6]value[ 7] : [7]value[ 8] : [8]value[ 9] : [9]
 
 
 
0 0