博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
阅读量:6232 次
发布时间:2019-06-22

本文共 5369 字,大约阅读时间需要 17 分钟。

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

 

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

1 #include 
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库的 百度网盘 下载地址在:

 

结果分析:

第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]

 

 作者:风波

 email: fengbohello@qq.com

 

转载地址:http://jhqna.baihongyu.com/

你可能感兴趣的文章
ylbtech-LanguageSamples-Versioning(版本控制)
查看>>
CSS 自适应
查看>>
如何编写Makefile?
查看>>
CSS--选择器
查看>>
将Ftp添加到资源管理器中直接使用
查看>>
Theano3.1-练习之初步介绍
查看>>
JAVA问题集锦Ⅰ
查看>>
Python使用os.listdir()函数来获得目录中的内容
查看>>
[AY技术分享]WPF AYUI的高大上日历代码
查看>>
Notepad++ 16进制编辑功能
查看>>
DICOM:DICOM标准学习路线图(初稿)
查看>>
常用Dockerfile举例
查看>>
Java NIO6:选择器2---代码篇
查看>>
摘要算法
查看>>
css3 实现逐帧动画
查看>>
zabbix监控交换机、防火墙等网络设备
查看>>
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
查看>>
WPF样式动画Trigger.EnterActions和Trigger.ExitActions(ExitActions其实可以不做任何事情)
查看>>
Linux IPC System V 消息队列
查看>>
史上最全的 UIWebview 的 JS 与 OC 交互
查看>>