(转)使用 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\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]
时间: 2024-11-07 13:25:05

(转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解的相关文章

sqlite学习笔记8:C语言中使用sqlite之创建表

前面已经说了如何打开和关闭数据库,这次要说得是如何执行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg) 参数: db:已经打开的数据库实例 sql:SQL语句,是一个字符串 callback:是一个回调函数 data:做为回调函数的第一个参数 errmsg:用于带回错误信息 该回调函数有两种返回值类型. 1.返回

《C语言中动态数组的创建及引用》

C语言中动态数组的创建及引用 动态数组是相对于静态数组而言的,静态数组的长度是预定义好的,在整个程序中,一旦给定了数组大小后就无法改变,,而动态数组则不然,它可以根据程序需要重新指定数组的大小.动态数组的内存空间是由堆动态分配的,通过执行代码为其分配储存空间,只有程序执行到分配语句时,才为其分配储存空间. 对于动态数组,其创建比静态数组更麻烦一些,使用完必须由程序员自己释放,否则将引起内存泄漏,但是其使用非常灵活,能根据程序需要动态分配大小,因此相对于静态数组来说,使用动态数组的自由度更大. 对

关于SQL Server 2017中使用json传参时解析遇到的多层解析问题

原文:关于SQL Server 2017中使用json传参时解析遇到的多层解析问题 开发新的系统,DB部分使用了SQL Server从2016版开始自带的Json解析方式. 用了快半年,在个人项目,以及公司部分项目上使用了,暂时还没遇到大的问题,和性能问题. 今天在解析Json的多级参数遇到了点小问题,在此记录一下: 传参内容如下: 1 declare @json varchar(max)=N'{"Customer":36,"Positions":[{"I

(转)在PHP语言中使用JSON

原文 : http://www.ruanyifeng.com/blog/2011/01/json_in_php.html ------------------------------------------------------------------------ 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式>,探讨它的设计思想.今天,我想总结一下PHP语言对它的支持,这是开发

在PHP语言中使用JSON

目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式>,探讨它的设计思想.今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识. 从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 该函数主要用来将数组和对象,转换为json格式.先看一个数组转换的例子: $arr = array ('a'

PHP语言中使用JSON和将json还原成数组

从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); ?> 输出 1 {"a":1,"b":2,"c":3,"d&quo

***在PHP语言中使用JSON和将json还原成数组(json_decode()的常见错误)

在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); ?> 输出 1

在PHP语言中使用JSON和将json还原成数组

在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); ?> 输出 1

JSON运用——PHP中使用json数据格式定义字面量对象的方法

目前,在PHP中是不支持字面量命名法. 前端的小伙伴都知道,在JS中用字面量定义一个对象的方法可以如下: var o = { 'name' : 'Tom' , 'url' : 'www.baidu.com' }; alert(o.name); 但在PHP中这么定义对象: $o = { "name" : "Tom", "url" : "www.baidu.com" }; 则会报错 Parse error: syntax erro