Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用cJSON库解析和构建JSON字符串

使用cJSON库解析和构建JSON字符串

作者头像
单片机点灯小能手
发布于 2020-07-16 11:58:02
发布于 2020-07-16 11:58:02
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

前言

其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON:

当时在MCU平台上使用时,会出现时间长了死机的情况,在调用cJSON_Print输出格式化后的JSON数据之后,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOG("JSON数据:\n%s\n", cJSON_Print(root));

要使用cJSON_Delete释放内存,否则会导致内存泄漏。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cJSON_Delete(root);     //调用cJSON_Print时才需要

这一点在嵌入式开发平台要格外注意。

解析和构建JSON的示例程序,我都已经上传到代码托管平台上,示例工程基于CodeBlocks开发环境。

  • Github仓库地址: https://github.com/whik/cJSON_Demo
  • Gitee仓库地址: https://gitee.com/whik/cJSON_Demo

或者通过下面的命令clone到本地:

Github:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://gitee.com/whik/cJSON_Demo.git

Gitee:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/whik/cJSON_Demo.git

JSON解析示例包括:

  • 和风天气实时数据
  • 心知天气实时数据
  • 心知天气3天预报数据
  • 城市空气质量AQI信息
  • 全国油价信息
  • 北京时间等。

JSON的构建:

  • 简单的键值对
  • JSON对象作为键的值
  • JSON数组
  • JSON数组的嵌套

JSON的构建

cJSON是一个基于C语言的JSON解析库,这个库非常简单,只有 cJSON.ccJSON.h两个文件,支持JSON的解析和构建,需要调用时,只需要 #include"cJSON.h"就可以使用了。

由于JSON的解析之前已经介绍过了:使用cJSON库解析JSON,所以本篇博文主要介绍使用cJSON来构建JSON,强大的cJSON库在构建JSON上也是非常的简单。

1.一个简单的JSON键值对构建

构建函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{    "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对象

构建函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{    "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数组,元素是字符串

构建函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
4.键的值是一个数组,数组包含多个对象元素

构建函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{    "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个字符串元素

构建函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{    "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"}

分享几个免费的API提供平台

  • K780: http://www.k780.com/api
  • 天气API: http://api.help.bj.cn/api/
  • 心知天气: https://www.seniverse.com/
  • 和风天气: http://www.heweather.com
  • 聚合数据: https://www.juhe.cn/

参考资料

  • cJSON库源码: https://sourceforge.net/projects/cjson/
  • JSON官方网站: http://www.json.org/json-zh.html

历史精选

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子电路开发学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】开源:基于cjson库的json数据处理
项目Github地址:https://github.com/DaveGamble/cJSON
DevFrank
2024/07/24
2060
【C++】开源:基于cjson库的json数据处理
Qt平台下使用QJson构建JSON字符串
上两篇文章介绍了使用cJSON库解析和构建JSON字符串和Qt平台下使用QJson解析JSON字符串
单片机点灯小能手
2020/07/16
1.4K0
一款轻量级的JSON解析库,用cJSON让你看清王者荣耀
王者荣耀出新英雄了,蔡文姬也迎来了属于她的澜朋友,那么本期带你揭秘王者全英雄全皮肤,一起来看看吧~
DeROy
2020/12/17
2K0
cJSON 使用详解
由于c语言中,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json。如果有对应的数据结构就方便一些, 如python中用json.loads(json)就把json字符串转变为内建的数据结构处理起来比较方便。
全栈程序员站长
2022/07/02
7820
C/C++程序开发: cJSON的使用(创建与解析JSON数据)
cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解析器,是一个用C语言编写的简单好用的JSON解析器;它只包含一个C文件和一个头文件,可以非常容易集成到自己工程项目中。
DS小龙哥
2022/01/12
8.8K0
C/C++程序开发: cJSON的使用(创建与解析JSON数据)
Qt平台下使用QJson解析JSON字符串
上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串
单片机点灯小能手
2020/07/16
3K0
一个超轻量级的JSON解析器
众所周知,JSON是一种轻量级的数据格式,应用广泛。在C/C++应用中也常常作为配置文件或者数据的存储,因此JSON文件的生成和解析是必备知识。
编程珠玑
2019/08/06
1.9K0
使用CJSON库实现XML与JSON格式的相互转化
之前完成了一个两个平台对接的项目。由于这两个平台一个是使用json格式的数据,一个是使用xml格式的数据,要实现它们二者的对接就涉及到这两个数据格式的转化,在查阅相关资料的时候发现了这个CJSON库,cjson是使用c编写的,它轻巧易用,在网上查了相关的资料后决定在json格式的存储于解析这块采用cjson库,而xml就简单的来解析字符串。
Masimaro
2018/08/31
2.4K0
[C] cJSON内存泄漏(cJSON memory leak)
在cJSON库中,cJSON_Print()也是会分配内存的,并且在打印完成后还需要程序员手动来释放分配的内存。 释放的方法如下
轻舞飞扬SR
2021/02/24
2K0
cJSON的使用方法
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。(来自“开源中国”资料)。
全栈程序员站长
2022/09/07
1.7K0
c++好用的json解析类源码分享及简单使用
json数据解析,这是很常见的功能需求。c语言里有有名的cJSON库可用,当然c++里也可以直接用或者做个封装。但是可用不代表着就好用。有些情况下我们拿c++做开发而不是选择c,不就是为了开发上高效,维护上方便,可以做一些大项目么。
杨永贞
2022/01/07
1.2K0
c++好用的json解析类源码分享及简单使用
妙哉!cJSON设计思想解读及封装JSON数据方法示例
看了cJSON的源码后,惊呼其设计之巧妙,其代码之简洁,其使用之方便!只有两个文件cJSON.h和cJSON.c,非常适合学习C语言中的链表。
Mculover666
2020/07/16
3K0
妙哉!cJSON设计思想解读及封装JSON数据方法示例
cjson创建数组「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135837.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
1.1K0
hws硬件营线上选拔赛
stm32单片机,给了一个bin文件,根据http://www.crystalradio.cn/thread-637028-1-1.html来反编译。
HhhM
2022/08/10
3640
hws硬件营线上选拔赛
使用go-zero微服务框架实现云监控后台(三.c语言操作cJson封装,json和结构体互转)
c语言操作cJson封装,以及json和结构体互转。如果不做封装直接操作cJSON有点儿繁琐。
杨永贞
2022/01/07
7430
conan入门(四):conan 引用第三方库示例
本文从一个示例开始:我们将创建一个使用cJSON应用程序来说明如何基于CMake 作为构建系统使用Conan无平台差异的引入依赖库。
10km
2022/04/13
2.9K0
使用cJSON解析JSON字符串
我们在使用JSON格式时,如果只是处理简单的协议,可以依据JSON格式,通过对字符串的操作来进行解析与创建。然而随着协议逐渐复杂起来,经常会遇到一些未考虑周全的地方,需要进一步的完善解析方法,此时,使用比较完善的JSON解析库的需求就提出来了。
全栈程序员站长
2022/09/07
1.8K0
使用cJSON解析JSON字符串
JSON学习-使用cJSON解析 使用cJSON解析JSON字符串 一、为何选择cJSON          我们在使用JSON格式时,如果只是处理简单的协议,可以依据JSON格式,通过对字符串的操作来进行解析与创建。然而随着协议逐渐复杂起来,经常会遇到一些未考虑周全的地方,需要进一步的完善解析方法,此时,使用比较完善的JSON解析库的需求就提出来了。          基于方便引用的考虑,我们希望这个JSON解析库是用C语言实现的。同时,为了避免太过复杂的C源码包含关系,希望最好是一个C文件来实现。通过
_gongluck
2018/03/08
18.8K1
C++简单实现一个令牌(Token)验证登录基于Windows平台下的CS交互
决定在哪里存储 token 值取决于多种因素,包括安全性、可扩展性、持久性和可用性等
晨星成焰
2024/08/06
4980
C++简单实现一个令牌(Token)验证登录基于Windows平台下的CS交互
疫情监控三部曲——在STM32F103 MCU上实现(裸机版)
2020,新冠肺炎疫情在全球蔓延,国内得到了有效的控制,最近国内部分地区的疫情形势又紧张起来。
单片机点灯小能手
2020/08/04
1.2K0
疫情监控三部曲——在STM32F103 MCU上实现(裸机版)
相关推荐
【C++】开源:基于cjson库的json数据处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验