linux c语言全面学习json解析函数

1,json结构的定义

typedef struct cJSON {  //cJSON结构体
       struct cJSON*next,*prev;           /* 遍历数组或对象链的前向或后向链表指针*/
       struct cJSON *child;                   /*数组或对象的孩子节点*/
       int type;                                     /* key的类型*/
       char *valuestring;                       /*字符串值*/
       int valueint;                                /* 整数值*/
       double valuedouble;                    /* 浮点数值*/
       char *string;                               /* key的名字*/
} cJSON;

2,json常用函数说明

(1)定义一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中申请空间,返回值是成功返回一个指向内存块中的cJSON的指针,失败返回NULL
cJSON *cJSON_Parse(const char *value);

(2)获取JSON字符串字段值
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);

(3)向对象中增加(字符)节点
   cJSON_AddStringToObject(root,"名称","字符串");  
     
 (4)    向对象中增加对象(字符串、数组、数字)
   cJSON_AddStringToObject(pJsonRoot, "hello", "hello world"); //添加字符串
    cJSON_AddNumberToObject(pJsonRoot, "number", 10010);//添加数字
    cJSON_AddBoolToObject(pJsonRoot, "bool", 1);//添加bool值
    cJSON_AddItemToObject(root,"名称",cJSON_CreateString("邝东宇")) ;  //添加对象
    cJSON_AddItemToObject(root,"名称",cJSON_CreateNumber(100))  ;  
    
(5)获取数组成员对象个数
int	  cJSON_GetArraySize(cJSON *array);
(6)获取数组元素
 cJSON* tmp=cJSON_GetArrayItem(array,1);  //下标从0开始  

3,函数应用举例:
将下面的数据用json解析打印出来:

{
    "name":    "hello world",
    "number":    10010,
    "bool":    true,
    "subobj":    {
        "level":    "middle"
    }
}

分析:
obj_1 : hello world
obj_2 : 10010
obj_3 : 1
sub_obj_1 : middle

代码如下:

#include                                                                                             
#include "cJSON.h"

char * makeJson()
{
    cJSON * pJsonRoot = NULL;

    pJsonRoot = cJSON_CreateObject();
    if(NULL == pJsonRoot)
    {
        //error happend here
        return NULL;
    }
    cJSON_AddStringToObject(pJsonRoot, "name", "hello world");
    cJSON_AddNumberToObject(pJsonRoot, "number", 10010);
    cJSON_AddBoolToObject(pJsonRoot, "bool", 1);
    cJSON * pSubJson = NULL;
    pSubJson = cJSON_CreateObject();
    if(NULL == pSubJson)
    {
        // create object faild, exit
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_AddStringToObject(pSubJson, "level", "middle");
    cJSON_AddItemToObject(pJsonRoot, "subobj", pSubJson);

    char * p = cJSON_Print(pJsonRoot);
  // else use : 
    // char * p = cJSON_PrintUnformatted(pJsonRoot);
    if(NULL == p)
    {
        //convert json list to string faild, exit
        //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
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    //free(p);
    
    cJSON_Delete(pJsonRoot);

    return p;
}

void parseJson(char * pMsg)
{
    if(NULL == pMsg)
    {
        return;
    }
    cJSON * pJson = cJSON_Parse(pMsg);
    if(NULL == pJson)                                                                                         
    {
        // parse faild, return
      return ;
    }

    // get string from json
    cJSON * pSub = cJSON_GetObjectItem(pJson, "name");
    if(NULL == pSub)
    {
        //get object named "hello" faild
    }
    printf("obj_1 : %s\n", pSub->valuestring);

    // get number from json
    pSub = cJSON_GetObjectItem(pJson, "number");
    if(NULL == pSub)
    {
        //get number from json faild
    }
    printf("obj_2 : %d\n", pSub->valueint);

    // get bool from json
    pSub = cJSON_GetObjectItem(pJson, "bool");
    if(NULL == pSub)
    {
        // get bool from json faild
    }                                                                                                         
    printf("obj_3 : %d\n", pSub->valueint);

 // get sub object
    pSub = cJSON_GetObjectItem(pJson, "subobj");
    if(NULL == pSub)
    {
        // get sub object faild
    }
    cJSON * pSubSub = cJSON_GetObjectItem(pSub, "level");
    if(NULL == pSubSub)
    {
        // get object from subject object faild
    }
    printf("sub_obj_1 : %s\n", pSubSub->valuestring);

    cJSON_Delete(pJson);
}

int main()
{
    char * p = makeJson();
    if(NULL == p)
    {
        return 0;
    }
    printf("%s\n", p);
    parseJson(p);                                                                                             
  free(p);  //千万不要忘记释放内存呀,cJSON_Print()函数或者cJSON_PrintUnformatted()产生的内存,使用free(char *)进行释放
    return 0;
}

你可能感兴趣的:(数据类型学习)