使用cJSON库解析和构建JSON字符串
使用cJSON库解析和构建JSON字符串
前言
其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON:
当时在MCU平台上使用时,会出现时间长了死机的情况,在调用cJSON_Print输出格式化后的JSON数据之后,
LOG("JSON数据:\n%s\n", cJSON_Print(root));
要使用cJSON_Delete释放内存,否则会导致内存泄漏。
cJSON_Delete(root); //调用cJSON_Print时才需要
这一点在嵌入式开发平台要格外注意。
解析和构建JSON的示例程序,我都已经上传到代码托管平台上,示例工程基于CodeBlocks开发环境。
Github仓库地址:
Gitee仓库地址:
或者通过下面的命令clone到本地:
Github:
git clone https://gitee.com/whik/cJSON_Demo.git
Gitee:
git clone https://github.com/whik/cJSON_Demo.git
JSON解析示例包括:
- 和风天气实时数据
- 心知天气实时数据
- 心知天气3天预报数据
- 城市空气质量AQI信息
- 全国油价信息
- 北京时间等。
JSON的构建:
- 简单的键值对
- JSON对象作为键的值
- JSON数组
- JSON数组的嵌套
JSON的构建
cJSON是一个基于C语言的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和构建,需要调用时,只需要#include "cJSON.h"就可以使用了。
由于JSON的解析之前已经介绍过了:使用cJSON库解析JSON,所以本篇博文主要介绍使用cJSON来构建JSON,强大的cJSON库在构建JSON上也是非常的简单。
1.一个简单的JSON键值对构建
构建函数:
void Create_Simple_JSON(void)
{
cJSON *root;
root = cJSON_CreateObject();//创建一个json对象
cJSON_AddItemToObject(root, "CSDN", cJSON_CreateString("https://blog.csdn.net/whik1194"));
cJSON_AddItemToObject(root, "cnblogs", cJSON_CreateString("https://home.cnblogs.com/u/whik/"));
cJSON_AddItemToObject(root, "Github", cJSON_CreateString("https://github.com/whik/"));
cJSON_AddStringToObject(root, "Blog", "http://www.wangchaochao.top/");
printf("构建的JSON:\n%s\n", cJSON_Print(root));
cJSON_Delete(root);
}
输出结果:
{
"CSDN": "https://blog.csdn.net/whik1194",
"cnblogs": "https://home.cnblogs.com/u/whik/",
"Github": "https://github.com/whik/",
"Blog": "http://www.wangchaochao.top/"
}
2.键的值是一个JSON对象
构建函数:
void Create_BJTime_JSON(void)
{
cJSON *root;
cJSON *result;
root = cJSON_CreateObject();//创建一个json对象
result = cJSON_CreateObject();
//result构建
cJSON_AddItemToObject(result, "timestamp", cJSON_CreateString("ok"));
//等效于下面
// cJSON_AddStringToObject(result, "timestamp", "ok");
cJSON_AddItemToObject(result, "datetime_1", cJSON_CreateString("2019-07-21 10:46:57"));
cJSON_AddItemToObject(result, "datetime_2", cJSON_CreateString("2019年07月21日 10时46分57秒"));
cJSON_AddItemToObject(result, "week_1", cJSON_CreateString("0"));
cJSON_AddItemToObject(result, "week_2", cJSON_CreateString("星期日"));
cJSON_AddItemToObject(result, "week_3", cJSON_CreateString("周日"));
cJSON_AddItemToObject(result, "week_4", cJSON_CreateString("Sunday"));
//等效于cJSON_AddNumberToObject(root, "ok", 1);
cJSON_AddItemToObject(root, "status", cJSON_CreateString("success"));
cJSON_AddItemToObject(root, "result", result);
cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");
printf("构建的JSON:\n%s\n", cJSON_Print(root));
cJSON_Delete(root);
}
输出结果:
{
"status": "success",
"result": {
"timestamp": "ok",
"datetime_1": "2019-07-21 10:46:57",
"datetime_2": "2019年07月21日 10时46分57秒",
"week_1": "0",
"week_2": "星期日",
"week_3": "周日",
"week_4": "Sunday"
},
"Blog": "www.wangchaochao.top"
}
3.JSON数组,元素是字符串
构建函数:
void Create_Array_Str_JSON(void)
{
cJSON *root;
const char *strings[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
root=cJSON_CreateStringArray(strings,7);
printf("%s\n",cJSON_Print(root));
cJSON_Delete(root);
}
输出结果:
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
4.键的值是一个数组,数组包含多个对象元素
构建函数:
void Create_Array_JSON(void)
{
cJSON *root;
cJSON *forceast;
cJSON *day1, *day2, *day3; //数组
day1 = cJSON_CreateObject();
day2 = cJSON_CreateObject();
day3 = cJSON_CreateObject();
cJSON_AddStringToObject(day1, "date", "2019-07-21"); //日期
cJSON_AddStringToObject(day1, "cond_txt", "多云"); //天气状况
cJSON_AddStringToObject(day1, "cond_code", "101"); //天气代码
cJSON_AddStringToObject(day1, "hum", "23"); //湿度
cJSON_AddStringToObject(day1, "tmp_H", "31"); //最高温度
cJSON_AddStringToObject(day1, "tmp_L", "25"); //最低温度
cJSON_AddStringToObject(day2, "date", "2019-07-22");
cJSON_AddStringToObject(day2, "cond_txt", "晴");
cJSON_AddStringToObject(day2, "cond_code", "100");
cJSON_AddStringToObject(day2, "hum", "20");
cJSON_AddStringToObject(day2, "tmp_H", "33");
cJSON_AddStringToObject(day2, "tmp_L", "26");
cJSON_AddStringToObject(day3, "date", "2019-07-23");
cJSON_AddStringToObject(day3, "cond_txt", "阵雨");
cJSON_AddStringToObject(day3, "cond_code", "107");
cJSON_AddStringToObject(day3, "hum", "45");
cJSON_AddStringToObject(day3, "tmp_H", "32");
cJSON_AddStringToObject(day3, "tmp_L", "25");
forceast = cJSON_CreateArray();
//注意顺序,索引依次递增
cJSON_AddItemToArray(forceast, day1); //元素0
cJSON_AddItemToArray(forceast, day2); //元素1
cJSON_AddItemToArray(forceast, day3); //元素2
root = cJSON_CreateObject(); //创建一个json对象
cJSON_AddStringToObject(root, "status", "ok");
cJSON_AddItemToObject(root, "weather", forceast);
cJSON_AddStringToObject(root, "update", "2019-07-21 11:00");
cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");
//等效于:cJSON_AddItemToObject(root, "update", cJSON_CreateString("2019-07-21 11:00");
printf("构建的JSON:\n%s\n", cJSON_Print(root));
cJSON_Delete(root);
}
输出结果:
{
"status": "ok",
"weather": [{
"date": "2019-07-21",
"cond_txt": "多云",
"cond_code": "101",
"hum": "23",
"tmp_H": "31",
"tmp_L": "25"
}, {
"date": "2019-07-22",
"cond_txt": "晴",
"cond_code": "100",
"hum": "20",
"tmp_H": "33",
"tmp_L": "26"
}, {
"date": "2019-07-23",
"cond_txt": "阵雨",
"cond_code": "107",
"hum": "45",
"tmp_H": "32",
"tmp_L": "25"
}],
"update": "2019-07-21 11:00",
"Blog": "www.wangchaochao.top"
}
5.数组内嵌套了5个数组,每个数组内有5个字符串元素
构建函数:
void Create_Array_Nest_JSON(void)
{
struct oil_stu{
char *city; //城市名称
char *oil_92_price; //92号汽油价格
char *oil_95_price;
char *oil_98_price;
char *oil_0_price;
};
cJSON *root;
cJSON *data; //包含多个数组
cJSON *table, *data_bj, *data_sh, *data_js, *data_tj;
const char *bj_str[5] = {"北京", "6.78", "7.21", "8.19", "6.45"};
const char *sh_str[5] = {"上海", "6.74", "7.17", "7.87", "6.39"};
const char *js_str[5] = {"江苏", "6.75", "7.18", "8.06", "6.37"};
const char *tj_str[5] = {"天津", "6.77", "7.15", "8.07", "6.41"};
const char *talbe_str[5] = {"地区", "92号汽油", "95号汽油", "98号汽油", "0号柴油"};
data_bj = cJSON_CreateStringArray(bj_str, 5); //只包含5个字符串的数组
data_sh = cJSON_CreateStringArray(sh_str, 5);
data_js = cJSON_CreateStringArray(js_str, 5);
data_tj = cJSON_CreateStringArray(tj_str, 5);
table = cJSON_CreateStringArray(talbe_str, 5);
data = cJSON_CreateArray();
cJSON_AddItemToArray(data, table);
cJSON_AddItemToArray(data, data_bj);
cJSON_AddItemToArray(data, data_sh);
cJSON_AddItemToArray(data, data_js);
cJSON_AddItemToArray(data, data_tj);
root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "status", "ok");
cJSON_AddStringToObject(root, "msg", "2019-07-21 11:00");
cJSON_AddStringToObject(root, "update", "2019-07-21 11:00");
cJSON_AddItemToObject(root, "data", data);
cJSON_AddStringToObject(root, "About", "wcc");
cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");
printf("构建的JSON:\n%s\n", cJSON_Print(root));
cJSON_Delete(root);
}
输出结果:
{
"status": "ok",
"msg": "全国各省份汽柴油价格信息",
"update": "2019-07-21",
"data": [
["地区", "92号汽油", "95号汽油", "98号汽油", "0号柴油"],
["北京", "6.78", "7.21", "8.19", "6.45"],
["上海", "6.74", "7.17", "7.87", "6.39"],
["江苏", "6.75", "7.18", "8.06", "6.37"],
["天津", "6.77", "7.15", "8.07", "6.41"]
],
"About": "wcc",
"Blog": "www.wangchaochao.top"
}
参考资料
- cJSON库源码:cJSON download
- JSON官方网站:json
历史精选
欢迎关注我的个人博客:www.wangchaochao.top
或微信扫码关注我的公众号

使用cJSON库解析和构建JSON字符串的更多相关文章
- Qt平台下使用QJson解析和构建JSON字符串
前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...
- js中JSON的解析(将json字符串转化为对象)和序列化(将对象转化为json字符串)(函数的功能一般都挺全的,需要的时候去查看完整函数)
js中JSON的解析(将json字符串转化为对象)和序列化(将对象转化为json字符串)(函数的功能一般都挺全的,需要的时候去查看完整函数) 一.总结 1.JSON解析:JSON.parse(myJS ...
- 彻底了解构建 JSON 字符串的三种方式
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...
- AJAX html 传输json字符串&&巧妙运用eval()来解析返回的JSON字符串
1.AJAX html 传输json字符串: js方法如下: function saveRetYwlsh(){ var xmbh = document.getElementById("xmb ...
- 【Java_Spring】java解析多层嵌套json字符串
java解析多层嵌套json字符串
- java解析复杂的json字符串
Java解析Json字符串--复杂对象(方法一) { "name": "三班", "students": [ { "age&q ...
- 使用cJSON库解析JSON
cJSON库的下载 cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJS ...
- 使用CJSON库实现XML与JSON格式的相互转化
之前完成了一个两个平台对接的项目.由于这两个平台一个是使用json格式的数据,一个是使用xml格式的数据,要实现它们二者的对接就涉及到这两个数据格式的转化,在查阅相关资料的时候发现了这个CJSON库, ...
- 两种库解析、构造 JSON
1.用CJSON库 1.1解析Json 需要解析的JSON文件: { "name":"Tsybius", , "sex_is_male":t ...
随机推荐
- Vue基础系列(五)——Vue中的指令(中)
写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...
- 基于Postman中的报错
Postman中的报错: Could not get any response 错误 Could not get any response There was an error connecting ...
- CentOS7 下nginx与PHP的安装与配置
下载Nginx 1.在服务器上新建文件夹 /home/soft/ ; 2.cd /home/soft/ => 执行命令下载Nginx wget http://nginx.or ...
- ASP.NET Core on K8S深入学习(10)K8S包管理器Helm
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Helm 1.1 为何需要Helm? 虽然K8S能够很好地组织和编排容 ...
- PHP中使用date获取上月最后一天出现的问题
上次做项目时,发现一个问题,这里记录一下: 问题: 在使用date函数获取上一个月最后一天或下个月最后一天时,如果当前日期是31号,获取的数据有问题. // 2019-12-01 正确应该是 2019 ...
- Spring 常犯的十大错误,(收藏后)永远不要在犯了
1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的内部结构及其实现, ...
- Python活力练习Day4
Day4:将列表的值按相反顺序依次输出 eg : input : list = [1,2,3,4,5] output : [5,4,3,2,1] 方法一:时间复杂度O(n),其中 n ...
- Pick of the Week'19 | 图数据库 Nebula 第 47 周看点-- insert 的二三事
每周五 Nebula 为你播报每周看点,每周看点由本周大事件.用户问答.Nebula 产品动态和推荐阅读构成. 今天是 2019 年第 47 个工作周的周五,来和 Nebula 看看本周有什么图数据库 ...
- P1356 数列的整除性
dp百题进度条[2/100] 题目链接 题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数 ...
- 建造者模式-C#改良实现
区分网上已有的一般建造者模式实现,个人觉得实现太单一了,自己google查了一些好的实现,挑了其中比较适合的,做个笔记. # region 标准Builder模式实现 // 产品 class Tele ...