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

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

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

前言

其实之前的两篇博文已经介绍了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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用aria2做离线下载
作者:matrix 被围观: 4,327 次 发布时间:2018-12-19 分类:零零星星 | 7 条评论 »
HHTjim 部落格
2022/09/26
1.1K0
Linux 编译安装aria2
Aria2 是一款轻量级、支持多协议与多来源的命令行下载工具,能从多个渠道同时下载文件,大幅提升下载速度。它资源占用低,支持多平台,通过命令行可灵活控制下载任务,还能处理磁力链接和种子文件,下载高效又稳定,是日常及 BT 下载的得力助手。
小宇-xiaoyu
2025/01/26
1061
腾讯云轻量应用服务器部署Aria2+AriaNg下载工具
Aria2是一款很好用的下载工具,支持多种下载协议,还能离线下载,配合腾讯云轻量应用服务器内置的宝塔面板镜像搭建一个web控制面板就在方便不过了。
zuantou
2021/07/21
10K0
腾讯云轻量应用服务器部署Aria2+AriaNg下载工具
Aria2 下载工具部署(local)
Aria2 下载工具部署(docker) 中介绍了使用 docker 部署 Aria2 的方法,如果已经安装了 docker,执行起来是比较简单的。
jgrass
2024/12/25
1940
Aria2 下载工具部署(local)
centos安装aria2
复读机: Aria2 (aria2c)是一款开源免费跨平台且不限速的多线程下载软件,其优点是速度超级快、体积轻盈、性能强劲、资源占用少;支持 HTTP / FTP / BT / Magnet 磁力链接等类型的文件下载;并且跨平台支持 Win、Mac、Linux,甚至在树莓派、NAS、路由器等设备上都能安装它。 下面是CENTOS7安装aria2的步骤。 1.下载 下载aria2 wget https://github.com/aria2/aria2/releases/download/release-1.
用户2135432
2018/06/04
11.1K0
Aria2安装(aria2安卓版手机配置教程)
在 ~/.config/systemd/user目录下创建aria2.service文件,
全栈程序员站长
2022/07/29
10.3K0
急速下载——Aria2
如果使用ARIA2进行挂机下载的话,建议使用云服务器这种可以二十四小时开机的机器,而且尽量选择大硬盘、大带宽的机器。
夜梦星尘
2024/08/20
2490
急速下载——Aria2
Aria2离线下载搭建
在服务的安全组或者防火墙中放行6800端口,我这里直接在宝塔面板中的安全中直接放行了
十玖八柒
2022/08/01
1.1K0
Aria2离线下载搭建
一款比 Curl、Wget 更轻量更强大的命令行下载工具!支持多协议和多源地址
aria2 是一款轻量且高效命令行下载工具,它提供了对多协议和多源地址的支持,并尝试将下载带宽利用率最大化,目前支持的协议包括HTTP(S)、FTP、BitTorrent(DHT, PEX, MSE/PE) 和 Metalink。通过 Metalink 的分块检查,aria2 可以在下载过程中自动的进行数据校验。
民工哥
2023/10/23
8210
一款比 Curl、Wget 更轻量更强大的命令行下载工具!支持多协议和多源地址
【树莓派】使用aria2及ui
更多配置详见官方文档https://aria2.github.io/manual/en/html/aria2c.html#basic-options
一朵灼灼华
2022/08/05
1.1K0
【树莓派】使用aria2及ui
BT种子、磁力链接下载工具 - Aria2 一键安装管理脚本 增强版
Aria2 是目前最强大的全能型下载工具,它支持 BT、磁力、HTTP、FTP 等下载协议,常用做离线下载的服务端。Aria2 一键安装管理脚本是 Toyo (逗比) 大佬最为知名的脚本作品之一,2018年11月14日逗比大佬因未知原因突然失联。所以自2018年12月7日起 P3TERX 开始接手这个项目并进行了大量的功能与细节优化,一直持续维护至今。增强版脚本整合了 Aria2 完美配置,在安装 Aria2 的过程中会下载这套配置方案,这套方案包含了配置文件、附加功能脚本等文件,用于实现 Aria2 功能的增强和扩展,提升 Aria2 的下载速度与使用体验,解决 Aria2 在使用中遇到的 BT 下载无速度、文件残留占用磁盘空间、任务丢失、重复下载等问题。
骤雨重山
2022/01/17
2.7K0
打造无限速私有网盘
今天给大家介绍如何利用开源工具,搭建一套无下载限制的私有云盘。
李俊鹏
2021/02/23
2.7K0
打造无限速私有网盘
Debian利用Aria2离线下载资源
先简单介绍下Aria2,这是一种离线下载工具,现在很多都用来离线下载百度云,115的资源。 也就意味着,这工具有众多版本。下面我介绍下利用服务器(Linux)来安装Aria2。 简单说说安装原因: 很多时候,我们本地的带宽对需要下载的资源服务器速度不理想, 而一般个人购买的服务器基本都是G口以上,下载速度很理想, 所以就产生先把资源离线到服务器,在从本地去服务器下载这个方法, 很类似于迅雷的离线下载,先放在自己的服务器,再去取回来。 理解了原理之后,制作一个Aria服务器就不难了。废话不多,开工; ①.De
刺_猬
2018/06/21
2.5K0
CentOS6搭建aria2+webUI
1、安装rpmforge源 wget -c http://repository.it4i.cz/mirrors/repoforge/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm     注意:centos7的rpmforge源在这里:     http://repository.it4i.cz
用户1086810
2018/09/27
1.4K0
Hacking Aria2 RPC Daemon
Author:ricterz ABSTRACT 在未设置任何安全措施的情况下,Aria2 RPC Server 可以接受任何未知来源的请求指令,并予以下载。即使存在诸如--rpc-secret、--rpc-user、--rpc-passwd之类的安全措施,也可以通过社会工程学手段进行攻击。通过 Aria2 RPC Server,可以进行 SSRF、Arbitrary File Write 等 Web 攻击手法,获取服务器权限。 1. INTERDUCTION Aria2 是一个命令行下运行、多协议、多来源下
Seebug漏洞平台
2018/03/29
2.9K0
Hacking Aria2 RPC Daemon
Aria2-不限速全平台下载利器
2016-06-2815:54:31 2 5,355℃热度 1.工具下载(包含本文中出现的所有工具的最新版本) 2. Aria2简介 3.安装与配置 3.1 Aria2 for macOS 3.2 Aria2 for Windows 4.进阶运用(浏览器插件) 目录 之前写过一篇,发现浏览下载人数众多,所以抽出时间把相关资源更新、失效的链接剔除以及添加最新软件下载链接(2017/01/17)。 这次给大家介绍一个下载利器,之前玩路由器也听说过,然而那时候水平有限,并不太懂。大家都知道,在mac
timhbw
2018/05/03
4.1K10
Aria2-不限速全平台下载利器
【Ubuntu】常用软件下载与安装汇总
发现很多诸如Detectron2的开源项目官方仅提供Liunx系统的安装方式,于是愤而将工作机系统换成了Ubuntu20.04,下面记录一些常用软件的安装方式,以便再次换机时能快速迁移,后续装新的软件会持续更新。
zstar
2022/10/04
2.3K0
【Ubuntu】常用软件下载与安装汇总
Centos安装aria2及WebUI控制界面
‎aria2 是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上传到BitTorrent群。使用 Metalink 块校验和,aria2 在下载文件时自动验证数据块。‎
jwj
2022/05/18
2.6K0
Aria2一键安装及管理脚本,宝塔面板搭建AriaNg前端- 星泽V社
Aria2作为一款linux下的下载神器,可以下载各种资源、种子文件、磁力链接等,功能强大,就不过多介绍了,此前提到过Aria2安装方法,这里再介绍个一键脚本,很方便,推荐使用; Github:
星泽V社
2022/05/30
2.9K0
Aria2一键安装及管理脚本,宝塔面板搭建AriaNg前端- 星泽V社
【视频】教你如何在 Centos 8 下安装 Linux 最新版 QQ
腾讯公司最近更新了Linux QQ,今天给大家通过视频分享如何在 Centos 8 下安装 Linux 最新版 QQ!
叮当叮
2020/04/20
1.8K1
【视频】教你如何在 Centos 8 下安装 Linux 最新版 QQ
推荐阅读
相关推荐
使用aria2做离线下载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验