为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!

如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更好!

且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。

点我下载cJSON

当我们下载好cJSON只需要把.c和.h文件包含文件拷贝到我们工程目录下,并将头文件和实现文件包含进来就可以使用了!

cJSON使用数据结构链表的方式来存储js对象。

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

正所谓万丈高楼平地起,先从最简单的开始!

先来介绍四个常用的cJSON函数:

cJSON *cJSON_Parse(const char *value);

作用:将一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体

返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL

cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);

作用:获取JSON字符串字段值

返回值:成功返回一个指向cJSON类型的结构体指针,失败返回NULL

char  *cJSON_Print(cJSON *item);

作用:将cJSON数据解析成JSON字符串,并在堆中开辟一块char*的内存空间存储JSON字符串

返回值:成功返回一个char*指针该指针指向位于堆中JSON字符串,失败返回NULL

void   cJSON_Delete(cJSON *c);

作用:释放位于堆中cJSON结构体内存

返回值:无

假如说有这样的一个JSON字符串

{"test_1":"0""test_2":"1""test_3":"2"
} //json_string //json_string

这是最简单的JSON字符串

我们首先要先将这个字符串打包成cJSON数据格式

cJSON* cjson = cJSON_Parse(json_string);

打包后使用if语句或三目表达式判断一下是否将JSON字符串打包成cJSON数据格式

if(cjson == NULL){
printf("json pack into cjson error...")
}
else{//打包成功调用cJSON_Print打印输出
cJSON_Print(cjson);
}
然后依次获取json字符串中的每个字段的值并打印输出
//cJSON_GetObjectltem返回的是一个cJSON结构体所以我们可以通过函数返回结构体的方式选择返回类型!
char* test_1_string = cJSON_GetObjectItem(cjson,"test_1")->valuestring;
char* test_2_string = cJSON_GetObjectItem(cjson,"test_2")->valuestring;
char* test_3_string = cJSON_GetObjectItem(cjson,"test_3")->valuestring;
//打印输出
printf("%s",*test_1_string);
printf("%s",*test_2_string);
printf("%s",*test_3_string);

最后别忘记释放内存

//delete cjson
cJSON_Delete(cjson);
cJSON_Delete(test_arr);
cJSON_Delete(arr_item);

完整代码:

#include <stdio.h>
#include <cJSON.h>
int main(){
char* json_string =\
//用char* 模拟一个JSON字符串
"{"\"test_1":"0"\"test_2":"1"\"test_3":"2"\
"}";
//JSON字符串到cJSON格式
cJSON* cjson = cJSON_Parse(json_string);
//判断cJSON_Parse函数返回值确定是否打包成功
if(cjson == NULL){
printf("json pack into cjson error...")
}
else{//打包成功调用cJSON_Print打印输出
cJSON_Print(cjson);
}//获取字段值
//cJSON_GetObjectltem返回的是一个cJSON结构体所以我们可以通过函数返回结构体的方式选择返回类型!
char* test_1_string = cJSON_GetObjectltem(cjson,"test_1")->valuestring;
char* test_2_string = cJSON_GetObjectltem(cjson,"test_2")->valuestring;
char* test_3_string = cJSON_GetObjectltem(cjson,"test_3")->valuestring;//打印输出
printf("%s",*test_1_string);
printf("%s",*test_2_string);
printf("%s",*test_3_string);//delete cjson
cJSON_Delete(cjson);}

是不是很easy?下面来教大家如何使用cJSON解析数组!

{"test_1":"1","test_2":"2","test_arr":[{
{"test_1":"arr_1","test_2":"arr_2","test_3":"arr_3"
},
{"test_1":"1","test_2":"2","test_3":"3"
}
}],
"test_3" :"3"
}//json_arr string

在开始前介绍一个函数

int    cJSON_GetArraySize(cJSON *array);

作用:获取数组成员对象个数
返回值:数组成员对象个数

首先第一步打包

cJSON* cjson = cJSON_Parse(json_arr_string);

第二步判断打包是否成功

if(cjson == NULL){
printf("cjson error...")
}
else{//打包成功调用cJSON_Print打印输出
cJSON_Print(cjson);
}

第三步获取数组对象

cJSON* test_arr = cJSON_GetObjectltem(cjson,"test_arr");

第四步获取数组对象个数便于循环

int arr_size = cJSON_GetArraySize(test_arr);//return arr_size 2

第五步获取test_arr数组对象孩子节点

cJSON* arr_item = test_arr->child;//子对象

第六步循环获取数组下每个字段的值并使用cJSON_Print打印:

for(int i = 0;i <=(arr_size-1)/*0*/;++i){
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_1"));
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_2"));
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_3"));
arr_item = arr_item->next;//下一个子对象
}

最后别忘记释放

cJSON_Delete(cjson);

完整代码:

#include <stdio.h>
#include <cJSON.h>
int main(){
char* json_string =\
//用char* 模拟一个JSON字符串
“{”,\"test_1":"1",\"test_2":"2",\"test_arr":"[{",\
"{",\"test_1":"arr_1",\"test_2":"arr_2",\"test_3":"arr_3",\
"}",\
"{"\"test_1":"1",\"test_2":"2",\"test_3":"3",\
"}",\
"}]",\
"test_3" :"3",\
"}"//json_arr string;//第一步打包JSON字符串
cJSON* cjson = cJSON_Parse(json_arr_string);//判断是否打包成功
if(cjson == NULL){
printf("cjson error…")
}
else{//打包成功调用cJSON_Print打印输出
cJSON_Print(cjson);
}//获取数组对象
cJSON* test_arr = cJSON_GetObjectltem(cjson,"test_arr");//获取数组对象个数便于循环
int arr_size = cJSON_GetArraySize(test_arr);//return arr_size 2//获取test_arr数组对象孩子节点
cJSON* arr_item = test_arr->child;//子对象//循环获取数组下每个字段的值并使用cJSON_Print打印
for(int i = 0;i <=(arr_size-1)/*0*/;++i){
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_1"));
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_2"));
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_3"));
arr_item = arr_item->next;//下一个子对象
}//delete cjson 这里只需要释放cjson即可,因为其它的都指向它
cJSON_Delete(cjson);

如果觉得博主写的不错,可以加技术交流群吖:815060222

全面详解c语言使用cJSON解析JSON字符相关推荐

  1. c语言遍历 json字符串,全面详解c语言使用cJSON解析JSON字符

    为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件! 如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更 ...

  2. c语言如何判断字符json,全面详解C语言使用cJSON解析JSON字符

    为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件! 如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更 ...

  3. php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...

    详解C语言求两个数的最大公约数及最小公倍数的方法 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y) ...

  4. php 微信 公众 平台,微信公众平台代码详解-php语言(一)

    2.这里把它粘贴出来,以注释的形式进行讲解. 3.首先我们要知道一些基础的知识: (1)要有自己的网站--公网环境,其中一个php页面处理微信消息: (2)微信公众平台和网站服务器之间是通过XML数据 ...

  5. 详解c语言main函数、printf函数、scanf函数与va家族

    C语言入门与提升(1)--详解c语言main函数.printf函数与scanf函数,与va家族 前言: 为什么要学习C语言呢?C语言作为最古老的语言之一,走过了半个多世纪的风风雨雨,至今仍然长盛不衰, ...

  6. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...

    导语 内容提要 殷人昆编著的<数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)>是清华大学出版社出版的<数据结构(C语言版)>(第2版)的配套教材,对" ...

  7. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  8. #转载:杨辉三角形实现过程详解-c语言基础

    杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...

  9. DBus glib 各数据类型接收与发送详解—C语言(3)

    DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...

最新文章

  1. 城市智能化发展中,AI公司应该做什么?
  2. python装饰器原理-看完这篇文章还不懂Python装饰器?
  3. java正则表达式 s报错_Java基础--正则表达式的规则
  4. Ubuntu16.04LTS安装ROS Kinetic
  5. 继续Bargaining
  6. ICML 2018 | 腾讯AI Lab详解16篇入选论文
  7. 微信怎么绑定消息服务器吗,fastweixin: 极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听...
  8. mysql 无法处理非法数据_MySQL 处理非法数据
  9. Web应用中避免Form重复提交的三种方案
  10. php日志接入rsyslog,php – Rsyslog重复日志(rsyslog.conf和rsyslog.d / something.conf)
  11. Buck电源设计和电感电容参数介绍
  12. 计算机科学与技术专业导论论文,浅谈计算机科学与技术专业论文
  13. keepass和坚果云实现全平台密码管理
  14. 52 图初探 Linux 通用知识
  15. spring boot 上传视频demo
  16. 【GO语言编程】(二)
  17. Android 12没显示出app的微件问题
  18. 卸载计算机安全证书,如何卸载ssl证书_卸载根证书的操作指南_什么是SSL卸载,SSL卸载优点有哪些? - 沃通SSL证书...
  19. AD画板学习笔记之爱心流水灯设计(未完成)
  20. 如何用虚拟机VMware安装win10/win7(最详细图解)

热门文章

  1. SpringBoot 笔记
  2. lintOnSave设置
  3. python爬虫数据存储文本_Python爬虫开发系列之五》数据存储为TXT、JSON格式
  4. apache php提示下载,apache正在下载php文件而不是显示它们。
  5. java插件开发_编写一个IDEA插件之:自动生成Java代码
  6. mysql 查询某个值非空_MySQL查询在单行中计算非空值
  7. 素数在c语言中怎么表示,请问素数怎么样表示
  8. python3web库_基于 Python3 写的极简版 webserver
  9. 计算机原理华东理工大学期末成绩查询,华东理工大学微机原理历年真题第十一章.ppt...
  10. e生保等待期什么意思_买了保险不知道赔什么?一文看懂【保险责任】