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)

我可不是懒哦!!!

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

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

相关文章

注意力机制篇 | YOLOv8改进之添加DAT注意力机制

前言:Hello大家好,我是小哥谈。DAT(Vision Transformer with Deformable Attention)是一种引入了可变形注意力机制的视觉Transformer。在训练算法模型的时候,通过引入可变形注意力机制,改进了视觉Transformer的效率和性能,使其在处理复杂的视觉任务时更加高效和准确。�…

扫地机器人(蓝桥杯)

文章目录 扫地机器人题目描述解题思路二分贪心 扫地机器人 题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示。 走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动…

黑马HTMLCSS基础

黑马的笔记和资料都是提供好了的,这个文档非常适合回顾复习。我在黑马提供的笔记上做了一些微不足道的补充,以便自己复习查阅。该笔记比较重要的部分是 表单,http请求 第一章. HTML 与 CSS HTML 是什么:即 HyperText Markup lan…

目标检测——植物病害图像数据集

一、重要性及意义 首先,植物病害图像是了解农业中植物生长和受病害情况的重要信息来源。通过对这些图像的分析,可以直观地观察到植物的生长状况,及时发现病害的存在。这不仅有助于农民和研究人员快速、准确地诊断植物病害,还能为…

代码随想录第27天 | 39. 组合总和、40.组合总和II、131.分割回文串

一、前言 今天的主题还是回溯算法&#xff0c;还是根据那个backtracking模板&#xff0c;但是今天会涉及到去重和一些小细节的问题。 二、组合总和 1、思路&#xff1a; 我一开始的想法就是在for循环转化为&#xff1a; for(int i 0; i < size; i) 但是这个是会陷入一…

C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)

文档格式的多样性丰富了我们的信息交流手段&#xff0c;其中Word文档因其强大的功能性而广受欢迎。然而&#xff0c;在网络分享、版本控制、代码阅读及编写等方面&#xff0c;Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式&#xf…

智慧安防监控EasyCVR视频调阅和设备录像回看无法自动播放的原因排查与解决

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

JMeter自定义日志与日志分析

1 JMeter日志概览 JMeter与Java程序一样&#xff0c;会记录事件日志&#xff0c;日志文件保存在bin目录中&#xff0c;名称为jmeter.log。当然&#xff0c;我们也可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起。 可见&…

数据分析之Tebleau可视化:折线图、饼图、环形图

1.折线图的绘制 方法一&#xff1a; 拖入订单日期和销售金额&#xff0c;自动生成一个折线图 方法二&#xff1a; 选中订单日期和销售金额&#xff08;摁住ctrl可以选择多个纬度&#xff09; 点击右边的智能推荐&#xff0c;选择折线图 2.双线图的绘制、双轴的设置 方法一&…

在Python中使用PyPDF2库在PDF文件中插入内容

目录 一、引言 二、PyPDF2库的安装 三、PyPDF2库的基本使用 四、在PDF文件中插入内容 五、注意事项和扩展 六、总结 一、引言 PDF&#xff08;Portable Document Format&#xff09;文件因其跨平台、不易被篡改的特性&#xff0c;广泛应用于日常办公和文档交流中。在实际…

MySQL连接查询补充与三表连查

前言 MySQL多表联查是指在一个查询语句中同时查询多个表&#xff0c;并根据表之间的关联条件进行数据的匹配和筛选。通过多表联查&#xff0c;我们可以获取到更丰富的数据信息&#xff0c;从而满足复杂的查询需求。先前了解了三种简单的连接查询方式&#xff0c;这里将进一步介…

17.应用负载压力测试

早些点&#xff0c;下午题考&#xff0c;最近几年出现的少&#xff1b; 备考较为简单&#xff1b;历年真题相似度高&#xff1b; 主要议题&#xff1a; 1.负载压力测试概述 注意这些测试细微的差别&#xff1b; 负载测试和压力测试的方法比较相似&#xff0c;但是目的不同&a…

如何使用potplayer在公网环境访问内网群晖NAS中储存在webdav中的影视资源

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-D7WJh3JaNVrLcj2b {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机&#xff1a;新零售时代的便捷消费革命 在新零售的浪潮中&#xff0c;智能无人售货机作为一个创新的消费模式&#xff0c;已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求&#xff0c;还能通过建立多样化和多层次的消费体…

2024年04月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2024年04月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

MotionBuilder 脚本执行

目录 MediaPipe_Pose_in_MotionBuilder 你可以用以下几种方式执行你的脚本&#xff1a; MediaPipe_Pose_in_MotionBuilder https://github.com/Ndgt/MediaPipe_Pose_in_MotionBuilder/blob/main/PoseLandmark.py tcp通信 https://github.com/nils-soderman/motionbuilder-s…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…

RabbitMQ安装及Springboot 集成RabbitMQ实现消息过期发送到死信队列

死信队列 RabbitMQ 的死信队列&#xff08;Dead-Letter-Exchanges&#xff0c;简称 DLX&#xff09;是一个强大的特性&#xff0c;它允许在消息在队列中无法被正常消费&#xff08;例如&#xff0c;消息被拒绝并且没有设置重新入队&#xff0c;或者消息过期&#xff09;时&…

微服务管理(完整)

前言&#xff1a; 分享一篇学微服务管理的过程 一&#xff0c;etcd入门 1&#xff0c;简介 1.1&#xff0c;etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 官网上的一段描述&#xff1a; A…

Mac 怎么提高音频播放速度?

mac 怎么提高音频播放速度&#xff1f;在Mac上&#xff0c;有时我们可能需要加快音频文件的播放速度&#xff0c;比如加快听力材料的播放速度以提高效率&#xff0c;或者快速浏览录音文件等。幸运的是&#xff0c;Mac系统自带的音频播放器iTunes和QuickTime都提供了简单的方法来…