使用cJSON库对JSON格式进行解析

news/2024/10/2 22:23:10

JSON format


基本概念

JSON是JavaScript Object Notation的简称,中文含义为“JavaScript 对象表示法”,它是一种数据交换的文本格式,而不是一种编程语言

它易于阅读和编写,并且易于机械解析和生成,常在Web开发中用于数据的格式和传输


数据格式

对象

JSON 由两种数据结构组成:对象和数组。对象(object)是由键值对组成的无序集合,键是字符串,值可以是任何类型,包括对象和数组。对象由一对花括号{ }包围,键和值之间用冒号:分隔。键值对之间用逗号,分隔。

//是一个JSON格式的对象,对象中有3个键值对 ,键的名称:“name”  “age”   “score”
{
//键值对
“name” 	:  “lmx”,     //值的类型:字符串
“age” 	:  29,		 //值的类型:整型“score”	:[			 //值的类型:数组 ,数组中有1个元素,元素类型是对象{//对象中包含2个键值对
“xxx”: 85.5,  //值的类型是浮点型
“xxx”: 92
}
]
}

数组

JSON 由两种数据结构组成:对象和数组。数组(array)是值(value)的有序集合,每个值可以是任何类型,包括对象和数组。数组由一对方括号[ ]包围,值之间用逗号,分隔。

[ "apple",  "banana",  "orange"] 

在上面的例子中,可以看到数组包含三个字符串元素,分别是:"apple"、"banana"和"orange"。


解析方法

一般嵌入式开发中可以使用cJSON库对JSON格式进行解析,cJSON库是基于C语言的一个开源项目,github下载地址:https://github.com/DaveGamble/cJSON

Untitled

cJSON库主要的文件有两个:一个是cJSON.c 一个是cJSON.h。使用时在工程中包含头文件即可,在cJSON.h头文件中有一个用于解析JSON格式的结构体,如下:

Untitled

解析JSON流程

  1. 想要解析JSON格式,前提是得到存储了JSON数据的字符串,一般就是HTTP的请求或者响应的时候,绝大多数的情况都是服务器响应的数据为JSON格式。

    Untitled

  2. 需要把存储了JSON数据的字符串进行转换,转换JSON格式,此时可以通过cJSON库中README.md来分析,可以知道调用 cJSON_Parse() 进行解析,该函数的返回值就是cJSON格式的数据

    Untitled

  3. 如果得到了转换成功的JSON格式的字符串,可以对该字符串进行调试输出,可以选择调用cJSON_Print(),该函数的返回值就是存储了JSON格式的字符串,如下:

    Untitled

  4. 如果输出结果没有问题,则可以开始对JSON数据进行解析,其中可以先从JSON对象中获得某个键的值,相当于对某个键值对进行解析,注意:如果键值对的值的类型不是字符串、整型、浮点型,则需要继续对键值对进行解析。否则,可以直接输出键值对的内容,利用JSON对象的结构体指针cJSON *的成员valuestring、valueint、valuedouble。

    Untitled

  5. 如果键值对的类型不是基本类型,而是对象或者数组,则需要继续解析,此时分为两种情况,第一种是情况:键值对的值的类型是数组,此时可以选择调用cJSON_GetArraySize()函数,该函数的作用是获取数组中的元素的数量。另外,可以选择调用cJSON_GetArrayItem()函数,可以获取数组中的元素,如果数组的元素类型是对象,则可以选择调用cJSON_GetObjectItem()函数对对象进行解析

    Untitled


构造JSON流程

  1. 如果打算构造JSON格式,则需要首先创建一个JSON顶层对象,需要调用cJSON_CreateObject(),也就是该函数可以创建对象,其实就是构造一对{ }。

    Untitled

案例

可以选择继续调用cJSON_CreateObject()来创建新的小对象,此时可以选择向小对象中添加键值对,添加键值对的前提是构造键值对,需要先把键值对的值添加到创建的对象中,再把小对象添加到其他对象中,具有嵌套关系。根据键值对的值的类型,可以选择调用。


Untitled

//示例:
{"action":"mode_set","mode":1,"datalist":{"username":"admin","password":"admin" }"register":["{"status":"0","msg":"Success." }"]
}//组数据:
cJSON *JsRegisterArr = cJSON_CreateArray();
cJSON *JsRegisterObj = cJSON_CreateObject();
cJSON_AddItemToObject(JsData, "register", JsRegisterArr);
cJSON_AddItemToArray(JsRegisterArr, JsRegisterObj);
cJSON_AddStringToObject(JsRegisterObj, "status", "0");
cJSON_AddStringToObject(JsRegisterObj, "msg", "Success");//解析数据:
cJSON *JsRegisterArr = NULL;
cJSON *JsRegisterObj = NULL;
cJSON *pValue = NULL;
UINT4  u4DataSize = 0; 
JsRegisterArr = cJSON_GetObjectItem(JsData, "register");
u4DataSize = cJSON_GetArraySize(JsRegisterArr);
for (UINT4 u4Index = 0; u4Index < u4DataSize; u4Index ++)
{JsRegisterObj = cJSON_GetArrayItem(JsRegisterArr, u4Index)pValue = cJSON_GetObjectItem(JsRegisterObj, "status");printf("status : %s \r\n", pValue->valuestring);pValue = cJSON_GetObjectItem(JsRegisterObj, "msg");printf("msg : %s \r\n", pValue->valuestring);
}//以下函数调用时都会申请内存,如果不释放内存会造成内存泄露:
cJSON_Parse();
cJSON_CreateObject();
cJSON_CreateArray();
cJSON_Print();
cJSON_PrintUnformatted();//释放内存:
cJSON_Delete();
cJSON_free();//用法解释:
//1.调用cJSON_Parse,cJSON_CreateObject,cJSON_CreateArray时,使用cJSON_Delete释放内存,
//比如JsData = cJSON_CreateObject(), DataListArr = cJSON_CreateArray();cJSON_AddItemToArray(DataListArr, JsData);
//这种情况只要cJSON_Delete(JsData), 这样也会同时释放DataListArr的内存。
//2.如果是调用cJSON_Print,cJSON_PrintUnformatted时,则使用cJSON_free();//建议:
//因为涉及申请内存及释放内存,所以在每次creat一个cJSON后,使用前都要判空。
cJSON *JsData = NULL;
JsData = cJSON_CreateObject();
if (JsData == NULL)return FAILURE;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【攻防演练】-- 蓝队复盘

攻防演练前期演练的意义:卡巴斯基实验室和B2B International调查报告曾指出,“IT安全中的人为因素:员工如何让企业更容易遭受攻击”,全球有40%的企业存在员工隐藏IT安全事故的情况。每年,有46%的IT安全事故是由企业员工造成的。 SolarWinds发布的网络安全调查报告显示,相比…

一些做过的生物遗传题

菜鸡 luyiming 也想变强的说。2020-山东 T23备注:第一部分题目讲的条件翻译过来就是 tsts 基因型是雌株,Ts_是雌雄同株。 (3) 第二问我自己的思考方法:注意到比例为两个 3:1,所以 Ts, ts 的分离是没啥问题的,不动。注意到我删掉雌雄其中之一的 A_ 配子,就变成了 [AT, At,…

Redis高级篇之最佳实践

Redis高级篇之最佳实践 今日内容Redis键值设计 批处理优化 服务端优化 集群最佳实践1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定:遵循基本格式:[业务名称]:[数据名]:[id] 长度不超过44字节 不包含特殊字符例如:我们的…

作业8:信息存储的层次与并行技术

作业8:信息存储的层次与并行技术 一. 单选题(共7题,70分)(单选题) 考虑为以下表达式生成代码 A=B+C ; D=E-F ; 在执行过程中不需要插入任何停顿周期就能够消除冲突的指令序列是( )。 A. B. C. D.​ 正确答案: C:;(单选题)目前存储系统中的主要矛盾是( ) A. 处理…

计算机网络体系结构

ch1 计算机网络体系结构计算机网络:一些互联的、自治的计算机系统的集合。互联:通过通信链路连接在一起。 自治:每台计算机都有自己的操作系统,资源管理、进程调度等。功能: 资源共享、信息传递、协作计算、分布 计算机网络的组成 由硬件和软件与协议组成。 按照功能组成:…

LeetCode 23. Merge k Sorted Lists solutions All In One

LeetCode 23. Merge k Sorted Lists solutions All In One LeetCode 23. 合并 k 个排序的链表 TypeScriptLeetCode 23. Merge k Sorted Lists solutions All In OneTypeScriptsolutions /*** Definition for singly-linked list.* class ListNode {* val: number* next…

zabbix 监控系统搭建实战记录

https://www.zabbix.com/documentation/5.0/manual/installation/install_from_packages 1、下载zabbix、下载mysql2、安装zabbix 、安装三个组件 yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent b、安装结果c. 创建初始数据库 产品手册 Make sure you have d…

计组要我命第一天

要命计组(1) 开始时间 2024-06-12 21:27:38 结束时间 2024-06-12 23:23:14硬件系统由运算器、存储器、控制器、输入设 备和输出设备5个部件组成 运算器:完成算术和逻辑运算 输出设备:将机器的运算结果转换为人 可识别的信息 五大部件的基本功能 输入设备:将信息输入到计算…