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

前言

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

  • 使用cJSON库解析JSON
  • 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.ccJSON.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);   //元素0cJSON_AddItemToArray(forceast, day2);   //元素1cJSON_AddItemToArray(forceast, day3);   //元素2root = 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

历史精选

  • 【2019北京国际消费电子博览会】参观总结
  • Qt实现软件自动更新的一种简单方法
  • Qt小项目之串口助手控制LED
  • 国产处理器的逆袭机会——RISC-V
  • JSON简介

欢迎关注我的个人博客:www.wangchaochao.top

或微信扫码关注我的公众号

转载于:https://www.cnblogs.com/whik/p/11223328.html

使用cJSON库解析和构建JSON字符串相关推荐

  1. 字符串不替代_使用第三方库demjson解析不规范的json字符串

    Json在编程中是一种轻量级的文件格式,在本地开发或者web开发中使用较多.JSON(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是 ...

  2. java 反射 json_java 反射机制构建JSON字符串

    java 反射机制构建JSON字符串.接着上一篇文章.今天继续学习利用java 反射机制构建JSON字符串. JSON的格式跟使用的方式方法就不讲了.这个百度一下就有--好了今天心情很糟糕.直接上代码 ...

  3. qt构建json字符串的时候,某一个值为字符串

    引言 构建json字符串的值时,其值为一个json对象组成的字符串.下面记录一下. 实现 直接上代码来说明问题. QJsonDocument subDoc;subDoc.setObject(subOb ...

  4. java解析多层嵌套json字符串

    java解析多层嵌套json字符串 java分别解析下面两个json字符串 package jansonDemo;import com.alibaba.fastjson.JSON; import co ...

  5. 讯飞实时语音转写 python3.6.1 可完美运行 解析返回的json字符串 输出所获语音文字

    百度语音识别对录音要求较高(可能是我的问题,sdk和在线api都试过了(滑稽保命)),失败后选择讯飞语音,官方提供的文档是python2版本的 ,经过修改后可在python3中运行 ,解析返回的jso ...

  6. Jackson解析与生成Json字符串

    Jackson API:http://tool.oschina.net/apidocs/apidoc?api=jackson-1.9.9 流式API读取和写入JSON内容离散事件. JsonParse ...

  7. 【QT开发专题-天气预报】6. 构建 JSON字符串

    实现的 http 天气预报,整体效果如下: 在网络传输时,通常是传输的 JSON 字符串 传输之前,首先要生成 JSON 字符串,接下来使用 Qt 提供的工具类,来生成如下格式的 JSON 字符串 { ...

  8. c#中快速解析和提取json字符串

    dynamic stuff1 = Newtonsoft.Json.JsonConvert.DeserializeObject("json字符串"); string Text = s ...

  9. STM32嵌入式系统FreeRTOS使用cJSON解析和构建JSON

    一.环境 控制器STM32F407+MDK5.34+cJSON1.7.7 二.安装cJSON MDK中打开Pack Install,选择Generic下边MDK-Pack::cJSON,点击安装Ins ...

  10. fastJson解析复杂的json字符串,经测试已经成功解析

    要解析的json数据格式为: HTTP/1.1 200 OK Content-Type: text/jsv Content-Length: length{ResponseStatus: {},Data ...

最新文章

  1. 用友BIP助力大型企业构建“敏态+稳态”的数智企业摩天
  2. flutter版本控制工具 `FVM`
  3. php双层foreach,php 双层foreach 如何提升效率
  4. C++之运算符重载(上)
  5. 机器学习算法数学基础之 —— 线性代数篇(2)
  6. wuzhicms刷新按钮的功能开发
  7. 附录-系统环境、系统属性
  8. 腾讯已问灵魂,鹅厂新立家风
  9. DevOpsSOP 基于阿里云VPC搭建Storm+Kafka+Zookeeper集群
  10. ognl概念和原理详解
  11. 2021年四川省卫生副高考试成绩查询时间,2021年四川卫生资格成绩查询时间及查分入口【6月4日起】...
  12. Maven 常用仓库网址
  13. 疯狂软件Oracle数据库视频
  14. MTK功能机2503 GPIO配置
  15. centos安装msfconsole
  16. linux中的段定义的,Linux中的段
  17. macbook 终端命令怎么使用_mac怎么打开终端?mac打开命令提示符的方法
  18. 五、数组(高琪java300集+java从入门到精通笔记)
  19. Forbidden什么意思
  20. OpenSolaris/Solaris中文FAQ

热门文章

  1. C++ 从入门到入土(English Version)Section 8 : Recursion, Searching and Backtracking
  2. NoSQL之MongoDB复制集配置、数据导出导入
  3. 菠萝在线完成数千万元A轮融资,盛力投资领投
  4. React 服务端渲染完美的解决方案
  5. Python游戏开发! Mac完美安装pygame
  6. Docker 从零开始制作基础镜像[centos]
  7. 利用线程池单线程下载网页信息
  8. 设计模式java23 观察者_23种设计模式(13)java观察者模式
  9. Java课设对对碰_java实现对对碰小游戏
  10. Hibernate的单向1-1关联(二)