cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库,JSON库

1,json和cJSON

那什么是JSON什么是cJSON,他们之间有什么样的关联呢,让我们一起来探究一下吧。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,也易于机器解析和生成。JSON采用键值对的方式来表示数据,通常用于Web应用程序之间的数据传输。

在 C 语言中,通常需要使用库来解析和生成 JSON 数据。其中,cJSON 是一个在 C 语言中操作 JSON 数据的开源库。它提供了一组函数,可以方便地解析 JSON 字符串、构建 JSON 对象,并进行相应的操作。通过 cJSON 库,C 语言程序可以方便地处理 JSON 数据,用于数据交换和存储等操作。

总结一下:

*JSON 是一种数据交换格式,用于表示结构化数据。

*cJSON 是一个用于在 C 语言中解析和生成 JSON 数据的开源库,使得 C 语言能够方便地处理 JSON 数据。

2,json的语法规则

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有简洁清晰的语法规则。下面是 JSON 的主要语法规则:

1. **数据类型**:
   - JSON 支持以下数据类型:
     - 字符串:使用双引号括起来的文本。
     - 数字:整数或浮点数。
     - 布尔值:true 或 false。
     - 对象:使用花括号 `{}` 表示,由键值对组成。
     - 数组:使用方括号 `[]` 表示,由值组成,多个值之间用逗号分隔。

2. **对象**:
   - JSON 对象是一个无序的键值对集合,键值对之间使用冒号 `:` 分隔,不同键值对之间使用逗号 `,` 分隔,整个对象使用花括号 `{}` 包围。
   - 例如:`{"name": "Alice", "age": 30, "isStudent": true}`

3. **数组**:
   - JSON 数组是一个有序的值的集合,值之间使用逗号 `,` 分隔,整个数组使用方括号 `[]` 包围。
   - 例如:`["apple", "banana", "cherry"]`

4. **字符串**:
   - JSON 字符串是以双引号 `"` 包围的文本序列,可以包含任意字符,包括转义字符(如 `\n` 表示换行)。
   - 例如:`"Hello, World!"`

5. **数字**:
   - JSON 中的数字可以是整数或浮点数,不允许使用十六进制、八进制等表示形式。
   - 例如:`42` 或 `3.14159`

6. **布尔值**:
   - JSON 中的布尔值只有两个取值:true 和 false。

7. **空值**:
   - JSON 中表示空值的关键字为 null。

总体来说,JSON 的语法简洁明了,易于理解和解析,是在不同系统间进行数据交换的常用格式。

,悟了就好啊。

3,JSON的数据封装

在 JSON 中,数据通常是通过对象(Object)和数组(Array)来进行封装和组织的。

1. **对象(Object)**:
   - JSON 对象是一种无序的键值对集合,使用花括号 `{}` 来表示。
   - 每个键值对由一个键(key)和一个值(value)组成,中间使用冒号 `:` 分隔,不同键值对之间使用逗号 `,` 分隔。

 

   - 例如:{"name": "Alice","age": 30,"isStudent": true}

2. **数组(Array)**:
   - JSON 数组是一种有序的值的集合,使用方括号 `[]` 来表示。
   - 数组中的每个元素可以是字符串、数字、布尔值、对象或者嵌套的数组,元素之间使用逗号 `,` 分隔。

 

   - 例如:["apple", "banana", "cherry"]

通过对象和数组的嵌套组合,可以实现复杂的数据结构。例如,一个包含多个用户信息的 JSON 数据可以使用对象和数组来进行封装:
 

{"users": [{"name": "Alice","age": 30,"isStudent": true},{"name": "Bob","age": 25,"isStudent": false}]
}

这样的数据封装形式使得 JSON 在表示各种数据结构时非常灵活和方便,适用于多种应用场景,如 Web 数据交换、配置文件等。

那在我们cjson中又是如何封装的呢,

也很简单就是创建链表和给链表中添加数据的过程

1.创建json头指针
cJSON* json = NULL;2.创建json头结点
json = cJSON_CreateObject();函数的原型如下:cJSON *cJSON_CreateObject(void);
该函数原型定义了 cJSON_CreateObject() 函数返回一个指向新创建的 JSON 对象的指针
(cJSON * 类型)。这个函数用于在 cJSON 库中创建一个空的 JSON 对象,
以便后续向其中添加键值对

这时候可能有小伙伴就好奇了cJSON是什么类型,

cJSON 在 JSON 库中是一个结构体类型。实际上,JSON 库中的 cJSON 结构体包含了表示 JSON 数据的各种类型(对象、数组、字符串、数字等)的字段和操作这些字段的方法。这个结构体的具体内容和操作系统会给予填充,而我们在使用 cJSON 库时主要关注如何利用这些字段和方法来解析和生成 JSON 数据。

所以不必过于深入探究,只要它是个结构体,里面的内容操作系统会给我们填充

cJSON_AddNullToObject(cJSON * const object, const char * const name);cJSON_AddTrueToObject(cJSON * const object, const char * const name);cJSON_AddFalseToObject(cJSON * const object, const char * const name);
函数接受两个参数:object:指向要添加 null 值的 JSON 对象的指针。
name:要添加的 null 值的键名。cJSON_AddBoolToObject(cJSON * const object, const char * const name, 
const cJSON_bool boolean);cJSON_AddNumberToObject(cJSON * const object, const char * const name,const double number);cJSON_AddStringToObject(cJSON * const object, const char * const name, 
const char * const string);
object:指向要添加布尔值的 JSON 对象的指针。
name:要添加的布尔值的键名。
第三个参数都为对应想要添加的值:布尔值、数字、字符串cJSON_AddRawToObject(cJSON * const object, const char * const name, 
const char * const raw);
object:指向要添加原始 JSON 数据的 JSON 对象的指针。
name:要添加的原始 JSON 数据的键名。
raw:要添加的原始 JSON 数据的字符串表示。cJSON_AddObjectToObject(cJSON * const object, const char * const name);
object:指向要添加 JSON 对象的 JSON 对象的指针。
name:要添加的 JSON 对象的键名。cJSON_AddArrayToObject(cJSON * const object, const char * const name);
object:指向要添加 JSON 数组的 JSON 对象的指针。
name:要添加的 JSON 数组的键名

4,输出JSON数据

我们怎么知道自己添加的数据到底是不是我们想要的数据呢,这时候我们就用到了一个函数

char *cJSON_Print(const cJSON *item);
这个函数接受一个参数:item:要打印为字符串的 cJSON 对象指针。注意:
cJSON_Print 函数将 cJSON 对象转换为格式化的 JSON 字符串,并返回新分配的字符串指针。调用方负责释放返回的字符串指针,以避免内存泄漏。

5,实例

我们说了这么多,还没有上代码呢,那我们到底是如何通过C语言添加JSON数据,以及输出数据的呢

当然我们要写就必须包含

注意:每个JSON的底层的实现原理都是不同的,大致分为(链表和树形结构)如果有兴趣我后面会专门写一篇博客

6,JSON的解析

我们有了JSON数据,要如何去使用它呢,这时候cJSON就提供了一些解析数据的api(紫色为解析api)

1.创建JSON对象(创建一个空的JSON对象)

cJSON* cJSON_CreateObject(void);

2.添加键值对到JSON对象中(string 是键,item 是值)

void cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item);

3.从字符串中解析JSON数据(JSON 字符串中解析 JSON 数据,并返回对应的 cJSON 对象。)

cJSON* cJSON_Parse(const char* value);

4.获取JSON对象中的值(从 JSON 对象中获取指定键的值)

cJSON* cJSON_GetObjectItem(const cJSON* object, const char* string);

5.获取JSON中数组的值(从 JSON 数组中获取指定索引处的元素)

cJSON* cJSON_GetArrayItem(const cJSON* array, int index);

6.获取JSON中字符串的值(从 cJSON 对象中获取字符串值)

const char* cJSON_GetStringValue(const cJSON* item);

7.将JSON数据转换为字符串

char* cJSON_Print(const cJSON* item);

8.释放JSON对象

void cJSON_Delete(cJSON* item);

代码实现一下喽!

7,每期一问

是不是很简单呢!

那么这期我们的问题就是:自己找到并加载到自己的项目中(cJSON.c cJSON.h)https://gitee.com/buxianxian-c/test/tree/master/cJSON

我可不是懒哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C和C++内存管理

目录: 一:C和C内存分布 二:C动态内存管理方式 三:C动态内存管理方式 四:operator new与operator delete函数 五:new和delete的实现原理 六:定位new表达式(placement-new) 七&#xff1…

使用YOLOv8训练自己的【目标检测】数据集

文章目录 1.收集数据集1.1 使用开源已标记数据集1.2 爬取网络图像1.3 自己拍摄数据集1.4 使用数据增强生成数据集1.5 使用算法合成图像 2.标注数据集2.1确认标注格式2.2 开始标注 3.划分数据集4.配置训练环境4.1获取代码4.2安装环境 5.训练模型5.1新建一个数据集yaml文件5.2预测…

了解IP地址的基本概念和修改步骤

在数字化时代,IP地址作为网络设备的唯一标识,其重要性不言而喻。无论是为了提升网络性能,还是出于隐私保护的需求,修改IP地址都是网络使用者可能遇到的操作。虎观代理将详细介绍如何修改IP地址,并探讨在修改过程中需要…

python+flask+django文献文件资料搜索系统

后端:python 前端:vue.jselementui 框架:django/flask Python版本:python3.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 本系统在设计过程中,很好地发挥了该开发方式的优…

例47:键盘事件演示

建立一个EXE工程,在默认窗体上放一个Image框和一一个text框。在text的按键事件中输入代码: Function Form1_Text1_WM_KeyDown(hWndForm As hWnd, hWndControl As hWnd,nVirtKey As Long, lKeyData As Long) As LongIf nVirtKey VK_SPACE ThenImage1.Pi…

Linux:IO多路转接之select

文章目录 selecttimeval结构体fd_set 优缺点分析完整代码 本节要介绍的主题是多路转接式IO select 先说结论,这个select是做什么的呢? select是负责在Linux系统中,让一个人可以有多个鱼竿,可以不停的进行轮询,只要有…

Trace链异常检测汇总

微服务应用与单块应用完全不同,一个微服务系统少则有几十个微服务组成,多则可能有上百个服务。比如BAT级别的互联网公司,一般都超过上百个服务,服务之间的依赖关系错综复杂,如果没有有效的监控手段,那么出现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法:将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突:不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突: 1. 开放寻址:产生哈希冲突后&…

Vue - 1( 13000 字 Vue 入门级教程)

一:Vue 导语 1.1 什么是 Vue Vue.js(通常称为Vue)是一款流行的开源JavaScript框架,用于构建用户界面。Vue由尤雨溪在2014年开发,是一个轻量级、灵活的框架,被广泛应用于构建单页面应用(SPA&am…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程,使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为线程执行体。…

使用神经网络-遗传算法优化神经网络-风电预测故障(BP,GABP,matlab)

本项目是故障预测,不是时序预测,本质还是分类问题 1 数据集介绍 特征文件: 标签文件:共计4个标签,其中大多数都是正常的,其他是3个不正常的类别 2 使用BP网络 2.1 读取数据,然后选择几个…

【深度学习】图像自然语言描述生成

案例 6:图像自然语言描述生成(让计算机“看图说话”) 相关知识点:RNN、Attention 机制、图像和文本数据的处理 1 任务目标 1.1 任务和数据简介 ​ 本次案例将使用深度学习技术来完成图像自然语言描述生成任务,输入…

MySQL复制拓扑2

文章目录 主要内容一.配置基本复制结构1.分别在三台主机上停止mysqld服务,并对状态进行确认:代码如下(示例): 2.对三个MySQL服务器的配置文件分别进行编辑,在[mysqld] 选项组中添加以下红色条目:3.在数据目…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面,异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式; 1.利用trycatchfinaly语句处理异常,优点是分开了处理异常代码和程序正常代码…

深入浅出 -- 系统架构之负载均衡Nginx反向代理

一、Nginx反向代理-负载均衡 首先通过SpringBootFreemarker快速搭建一个WEB项目:springboot-web-nginx,然后在该项目中,创建一个IndexNginxController.java文件,逻辑如下: Controller public class IndexNginxControl…

【放假第3天】幻兽帕鲁 雾锁王国 我的世界 游戏云服务器选购指南 附最新价格对比表 新手、小白秒懂

更新日期:4月6日(半年档 价格回调,京东云采购季持续进行) 本文纯原创,侵权必究 【云服务器推荐】价格对比!阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xf…

前端三剑客 —— CSS (第四节)

目录 内容回顾: 1.常见样式 2.特殊样式 特殊样式 过滤效果 动画效果 动画案例: 渐变效果 其他效果: 多列效果 字体图标(icon) 内容回顾: 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的…

【话题:工作生活】2022年工作总结--疫情下的上海,疫情中的我。

现在是阳历2023年11月27日星期一,我再次开始撰写自己的年终工作总结。希望再过1、2个月,这份年终总结能够出炉,与大家相遇。 给自己定个小目标,年终的工作生活总结坚持写10年。我2017年毕业,之后就开始写每年的年终总结…

软考117-上午题-【计算机网络】-杂题+小结

一、杂题 真题1: 真题2: 真题3: 真题4: 真题5: 真题6: 真题7: 真题8: 真题9: 真题10: 真题11: 真题12: 真题13: 真题14&a…

c# wpf LiveCharts MVVM绑定 简单试验

1.概要 c# wpf LiveCharts MVVM绑定 简单试验 2.代码 <Window x:Class"WpfApp3.Window3"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://s…