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.hqwc.cn/news/597753.html

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

相关文章

特征提取算法

特征提取算法 0. 写在前边1. Harris算法1.1 写在前面1.2 Harris算法的本质1.3 Harris算法的简化 2. Harris3D2.1 Harris3D算法问题定义2.2 Harris3D with intensity2.3 Harris3D without intensity 3. ISS特征点的应用 0. 写在前边 本篇将介绍几种特征提取算法,特征…

ASP.Net添加Swagger注释

文章目录 Swagger添加Swagger注释 Swagger 添加Swagger注释 1、右击项目->选择属性->点击生成->输出,选中文档文件 2、配置服务 在program.cs 文件里配置SwaggerUI //增加项一 builder.Services.AddSwaggerGen(c> {c.SwaggerDoc("v1", ne…

前端开发学习笔记 3 (Chrome浏览器调试工具、Emmet语法、CSS复合选择器、CSS元素选择模式、CSS背景)

文章目录 Chrome浏览器调试工具Emmet语法CSS复合选择器后代选择器子选择器并集选择器伪类选择器 CSS元素选择模式元素选择模式概述CSS块标签CSS行内标签CSS行内块标签CSS元素显示模式转换 CSS背景CSS背景颜色CSS背景图片CSS背景图片平铺CSS背景图片位置CSS背景图片固定CSS背景复…

AWS的优劣势分析,适用于哪些行业?

AWS相较于其他云厂商,起步早,产品成熟及涉及范围广,具有高度适配性,多年来一直引领着IaaS市场,服务器的可用性比其他的云厂商要高,并且在全球25个地区拥有81个可用性区域,基本上辐射范围已经涵盖…

【javaWeb补充篇配置Bean】XML配置Bean

XML配置bean 配置BeanBean的声明周期bean的销毁时机 依赖注入方式自动装配集合注入加载properties文件容器类层次结构图 配置Bean 以配置文件的形式配置Bean 在资源目录下创建.xml文件进行对Bean的配置 在创建文件之前还首先需要引入spring中spring-context的依赖 <depende…

深入研究:我国工业实时操作系统的核心技术与演进路径

实时操作系统&#xff08;RTOS&#xff09;在各类工业场景中发挥着中枢神经系统的关键作用&#xff0c;是数字化工业的重要基础。当前&#xff0c;全球大部分工业实时操作系统市场被国外厂商占据&#xff0c;围绕主流RTOS产品内核提供了完备的上下游软件配套&#xff0c;并以嵌…

RTX RTOS 操作实例分析之---线程(thread)

0 Preface/Foreword 1 线程&#xff08;thread&#xff09; 1.1 线程定义 1.1.1 USE_BASIC_THREADS&#xff08;宏定义&#xff09; 经过以上步骤&#xff08;makefile包含&#xff09;&#xff0c;USE_BASIC_THREADS在编译阶段被定义到相应的模块中。 1.1.2 定义线程ID变量…

开启虚拟机时出现此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态怎么解决

问题描述 虚拟机安装完成后&#xff0c;点击开启此虚拟机弹出系统提示 原因分析&#xff1a; Intel VT-x 处于禁用状态&#xff0c;需要开启。 解决方案&#xff1a; 以联系小新笔记本电脑为例&#xff0c;进入BIOS界面&#xff0c;将Intel Virtual Technology设置成Enabl…

什么是物联网云平台

在信息化和智能化浪潮的推动下&#xff0c;物联网云平台作为连接物理世界与数字世界的桥梁&#xff0c;正日益成为企业数字化转型的关键支撑。物联网云平台通过集成先进的云计算、大数据分析和人工智能等技术&#xff0c;为企业提供了高效、安全、智能的数据处理和应用服务&…

主食冻干哪个牌子好?热门大牌真实实测分享,轻松避雷!

在选购主食冻干时&#xff0c;很多铲屎官都面临着选进口还是国产的难题。很多铲屎官认为进口产品在品控和配方上更优秀&#xff0c;但实际营养指标却逊于国产&#xff0c;价格也不菲。所以不免选购时会犹豫&#xff0c;最后抱着试一试的心态盲入主食冻干&#xff0c;运气好&…

【C语言】_文件类型,结束判定与文件缓冲区

目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被称为文本文件或二进制文件&#xff1b; 数据在内存中以二进制的形式存储&#xff0c;如果不加转换地输出到外存&#xff0c;就是二进…

体验OceanBase 的binlog service

OceanBase对MySQL具备很好的兼容性。目前&#xff0c;已经发布了开源版的binlog service工具&#xff0c;该工具能够将OceanBase特有的clog模式转换成binlog模式&#xff0c;以便下游工具如canal、flink cdc等使用。今天&#xff0c;我们就来简单体验一下这个binlog service的功…