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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 使用cJSON库解析和构建JSON字符串

640.jpg


前言

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


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

LOG("JSON数据:\n%s\n", cJSON_Print(root));


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

cJSON_Delete(root);     //调用cJSON_Print时才需要


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


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



或者通过下面的命令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);   //元素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);
}


输出结果:

1. {
2.     "status": "ok",
3.     "msg": "全国各省份汽柴油价格信息",
4.     "update": "2019-07-21",
5.     "data": [
6.         ["地区", "92号汽油", "95号汽油", "98号汽油", "0号柴油"],
7.         ["北京", "6.78", "7.21", "8.19", "6.45"],
8.         ["上海", "6.74", "7.17", "7.87", "6.39"],
9.         ["江苏", "6.75", "7.18", "8.06", "6.37"],
10.         ["天津", "6.77", "7.15", "8.07", "6.41"]
11.     ],
12.     "About": "wcc",
13.     "Blog": "www.wangchaochao.top"
14. }
目录
相关文章
|
2天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
121 75
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
29天前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
96 52
|
26天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
27天前
|
数据采集 JavaScript API
网页解析库:BeautifulSoup与Cheerio的选择
网页解析库:BeautifulSoup与Cheerio的选择
|
1月前
|
监控 持续交付 数据库
构建高效的后端服务:微服务架构的深度解析
在现代软件开发中,微服务架构已成为提升系统可扩展性、灵活性和维护性的关键。本文深入探讨了微服务架构的核心概念、设计原则和最佳实践,通过案例分析展示了如何在实际项目中有效地实施微服务策略,以及面临的挑战和解决方案。文章旨在为开发者提供一套完整的指导框架,帮助他们构建出更加高效、稳定的后端服务。
|
1月前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
75 0
|
2月前
|
监控 安全 Java
构建高效后端服务:微服务架构深度解析与最佳实践###
【10月更文挑战第19天】 在数字化转型加速的今天,企业对后端服务的响应速度、可扩展性和灵活性提出了更高要求。本文探讨了微服务架构作为解决方案,通过分析传统单体架构面临的挑战,深入剖析微服务的核心优势、关键组件及设计原则。我们将从实际案例入手,揭示成功实施微服务的策略与常见陷阱,为开发者和企业提供可操作的指导建议。本文目的是帮助读者理解如何利用微服务架构提升后端服务的整体效能,实现业务快速迭代与创新。 ###
70 2
|
2月前
|
前端开发 开发者 容器
构建响应式Web界面:Flexbox与Grid布局的深度解析
【10月更文挑战第11天】本文深入解析了CSS3中的Flexbox和Grid布局,探讨了它们的特点、应用场景及使用方法。Flexbox适用于一维布局,如导航栏;Grid布局则适用于二维布局,如复杂网格。通过示例代码和核心属性介绍,帮助开发者灵活构建响应式Web界面。
61 5
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
178 0
在Java中处理JSON数据:Jackson与Gson库比较

推荐镜像

更多