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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:

本文用代码简单介绍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 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\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]
复制代码

 


本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4033272.html,如需转载请自行联系原作者

相关文章
|
20天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
5天前
|
JSON 前端开发 JavaScript
解析JSON文件
解析JSON文件
27 9
|
11天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
32 0
|
18天前
|
开发者 测试技术 Android开发
Xamarin 开发者的五大常见问题及解决方案:从环境搭建到性能优化,全面解析高效跨平台应用开发的技巧与代码实例
【8月更文挑战第31天】Xamarin 开发者常遇问题及解决方案覆盖环境搭建至应用发布全流程,助新手克服技术难关。首先需正确安装配置 Visual Studio 及 Xamarin 支持,设置 iOS/Android 测试环境。利用 Xamarin.Forms 和 XAML 实现高效跨平台开发,共享 UI 和业务逻辑代码。针对性能优化,采取减少 UI 更新、缓存计算结果等措施,复杂问题则借助 Xamarin Profiler 分析。
30 0
|
19天前
|
数据采集 弹性计算 供应链
阿里云服务器付费模式:按量付费、包年包月和抢占式实例全解析
阿里云服务器提供包年包月、按量付费与抢占式实例三种付费模式。包年包月为预付费,适合长期稳定使用,价格更优惠并支持备案。按量付费则为后付费模式,按小时结算,适合短期或访问量波动大的场景,但不支持备案。抢占式实例基于按量付费,价格更低(最多节省90%),适用于无状态应用,如临时测试或可弹性伸缩的Web服务,但存在被系统释放的风险,同样不支持备案。根据具体需求选择合适的付费模式能够有效降低成本并提高效率。
38 0
|
23天前
|
JSON API 数据格式
基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架
【8月更文挑战第25天】这段资料介绍了一个使用Python从服务器获取实时天气数据并解析JSON格式数据的基本框架。主要分为三个部分:一是安装必要的`requests`库以发起HTTP请求获取数据,同时利用Python内置的`json`库处理JSON数据;二是提供了具体的代码实现,包括获取天气数据的`get_weather_data`函数和解析数据的`parse_weather_data`函数;三是对代码逻辑进行了详细说明,包括如何通过API获取数据以及如何解析这些数据来获取温度和天气描述等信息。用户需要根据实际使用的天气API调整代码中的API地址、参数和字段名称。
|
25天前
|
JSON 数据格式 索引
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
|
26天前
|
程序员 C语言
位操作在C语言中的解析与应用
位操作在C语言中的解析与应用
62 0
|
29天前
|
JSON 前端开发 JavaScript
|
8天前
|
JSON JavaScript 前端开发
Haskell中的数据交换:通过http-conduit发送JSON请求
Haskell中的数据交换:通过http-conduit发送JSON请求

推荐镜像

更多