zoukankan      html  css  js  c++  java
  • (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

    使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

     

    本文用代码简单介绍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
    ", 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
    ", 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
    ", 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
    ", 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
    ", 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 world
    10 obj_2 : 10010
    11 obj_3 : 1
    12 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
    ");
     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]
    ", 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]
     
  • 相关阅读:
    Web框架&&django介绍
    bootstrap
    jQuery
    js Bom和Dom
    javascript
    css
    二分查找
    php常用函数
    基于laravel自定义测试组件
    Document
  • 原文地址:https://www.cnblogs.com/LJWJL/p/7136941.html
Copyright © 2011-2022 走看看