Json和cJson的学习总结以及在STM32里移植cJSON需要注意哪些问题

STM32快速使用CJSON(打包与解析) 目录㈠准备①软件②硬件③CJSON㈡导入项目㈢测试打包JSON数据STM32串口接受的数据㈣解析JSON数据STM32串口接受的数据 ㈠准备 ①软件 MDK ②硬件 USB转TTL(调试) STM32开发板 ③CJSON 下载入口 找到其中的CJSON.c和CJSON.h ㈡导入项目 将CJSON.c和CJSON.h导入项目并在魔术棒中包含路径 在startup_stm32f407xx这个文件里面将Heap_Size设置为0xC00 在main.c中包含头文件 #include “cJ 阅读详情

最近在做项目的时候遇到了JSON格式的数据。需要对Json格式的数据进行解析,而我所使用的设备是嵌入式单片机,因此需要借助cJson来将Json和C语言结合起来。这篇文章就是我对Json和cJson相关内容知识的一个总结。

1 JSON的介绍

1.1 JSON产生的原因

首先,JSON为什么出现。Json是一种人们规定的数据交换格式。在现实生活中,我们需要进行数据交换的情景非常多,但是许多情况下,由于各个设备所采用的语言、架构不同,因此一个设备内部的数据、变量、结构体、对象等不能被其他设备所识别,这就好像一个中国人需要的数字格式是一、二、三,一个英国人需要的数字格式是one、two、three,这两个人是无法进行正常的数据交换的。
那么这个时候如果我们把我们所需要交换的数据,通过某种固定的格式,变成大家都能识别的语言,这样的话,数据的交换只交换大家都能识别的语言,每个设备就不需要考虑数据交换的对方的语言,而只需要对要交换的数据按照约定的格式进行打包和解析。就像中国人和英国人只需要各自将数字转化为1、2、3的格式,或者将1、2、3格式的数字转化为各自所需要的语言格式,这样两个人就能正常交流了。

1.2 JSON的格式

那么我们已经知道了Json产生的原因,那么一个Json具体是什么样的呢?网上很多文章都提到了JSON的键、键值、数组等等,这样看起来JSON也很复杂,难以理解。其实我们抓住本质来说,JSON首先是一个纯的文本(字符串)。因为JSON是需要在各个编程语言中都能存在的,因此JSON的本质就是一堆文本。只不过因为这种文本为了方便打包和解析,我们定义了具体的写法和结构,因此我们可以给出定义:用于数据交换的、采用这种写法的、字符串、就叫JSON。

那么具体来说JSON是采用怎样的写法呢?也就是说,JSON的结构是什么。要弄清楚这个,首先我们要有一定的编程基础,知道在我们常用的语言中,例如C、C++、Java等,变量的种类都有什么。因为JSON的目的是将一个设备中的变量告诉给另个一设备,所以首先我们要知道我们需要在JSON中表达出来的变量的类型都有什么。然后当我们知道了我们需要表达的类型,我们再去知道通过什么样的格式来将变量构造成文本。

那么在常用的语言中,变量的种类基本上可以分为两种(这里我们不是讨论变量的具体形式例如整形、浮点型,而是谈论变量的表达方法),一种是对象,一种是数组。一个对象具有属性,每个属性又有该属性的属性值。例如某同学是一个对象,该同学具有的属性有姓名,年龄等,每个属性有其对应的属性值,“小明”、“15”,属性值可以是数值、字符串、数组、对象等形式。
那么我们如何把上述的对象转化为JSON格式的文本呢?

//实际交换时的JSON数据
{"student": { "name": "小明","age":15}}


//便于阅读的JSON数据
{
    "student": 
        {
            "name": "小明",
            "age":15
        }
}

入上图所示,“student”:表示对象,{ }表示对象的内容,对象内容里
"name"表示属性,“:”后面跟的是属性值,“,”表示并列的属性。通过这样的文本我们就将一个对象转化为了JSON数据,从而能够进行数据交换。

之前我们介绍到,数据的类型还有数组的形式,同样举例来说,加入我们现在面向整个班级,每个班级的学生都是一个对象,这么多个对象在一起组成一数组,这个数组就是我们所说的班级,那么如何把一个班的数据转化为JSON格式呢?

//实际交换时的JSON数据
{"class":{"class_number":1,"students":[{"name": "小明","age":15},{"name": "小红","age":14}, {"name": "小强","age":14}]}}


//便于阅读的JSON数据
{
    "class":
        {
            "class_number":1,
            "students":[
                {
                    "name": "小明",
                    "age":15
                },
                {
                    "name": "小红",
                    "age":14
                },      
                {
                    "name": "小强",
                    "age":14
                }]        
      }
  }

这里通过“[ ]”来表达数组。

总结来说,
1.首先一个JSON格式的文本以“{ }”为开头和结尾。
2.“{ }”内的为该对象所包含的属性。
3.属性加“ : ”的后面是该属性的属性值。
4.“,”表示相同对象中的不同属性,或相同数组里的不同个体。
5.“[ ]”表示数组。
6.数组和对象的区别在于,数组的成员是具有属性的不同个体,而对象的成员的是不同属性。

通过这种文本架构,我们就能将许多变量转化为我们所需要的JSON格式来进行数据交换。

到这里我们已经基本上对于JSON有了一个了解。此外补充几点,因为JSON的这种格式其实是在javascript中延伸出来的,可以存储Javascript复合对象,因此在这类平台中使用较为方便。

这里介绍一个网站可以进行JSON的数据在线解析。
https://www.json.cn/

以及JSON的说明网站
http://www.json.org/

2 cJSON的介绍

2.1 什么是cJSON,什么是cJSON结构体

接下来我们来将目光转向cJson。

Json在C语言中的使用存在一个问题,那就是C语言是一种面向过程的语言,和其他语言不同,因此C语言中没有对象等定义。那么Json在C语言的平台的使用过程中,就需要进行一些独属于C语言的解析和打包方法,这种基于C语言的JSON的处理方法我们称之为cJson。

目前已经有别人写好的cJSON的开源代码供我们使用,这样我们就不用花时间在造轮子上,而只需要学会如何取使用。因此接下来我们重点介绍cJSON的使用。

首先我们要在工程里包括cJson.c和cJson.h文件。这两个文件可以在网上自己找。或者我的下载里也有。

然后我们先从cJson结构体来入手,了解如何用C语言打包一个Json和如何用C语言解析一个Json。

上文所说。C语言没有对象这一概念,因此我们定义了一个结构体,我们称这个结构体为cJson结构体,从而将对象转化为了CJSON格式的结构体。从而在C语言中,我们打包或者解析一个JSON,经历的步骤为:需要打包的变量<——>cJson结构体<——>Json文本

从.h文件我们可以找到一个cJson结构体的形式:

typedef struct cJSON {
	struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
	struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

	int type;					/* The type of the item, as above. */

	char *valuestring;			/* The item's string, if type==cJSON_String 
物联网项目设计(四)cJSON 在 STM32 移植和使用 概要 JSON格式是互联网通讯过程中常用的格式。包括MQTT协议也不例外,MQTT协议的数据收发都是使用JSON格式完成的。在使用MQTT协议进行通讯之前,我们需要掌握在c语言环境下JSON格式数据的操作。对JSON数据的操作我们使用了cJSON开源库。在使用的过程中,也遇到了不少问题(见后文),为此我查阅了很多资料,最后找到比较简单的方法解决了这个问题。 阅读详情

相关推荐

STM32使用CJSON库解析生成JSON数据

摘要: 本文介绍了如何在STM32F103ZET6微控制器上移植和使用CJSON库实现JSON数据的生成与解析。首先概述了JSON格式的优势和CJSON库的轻量级特点,阐述了STM32与CJSON结合在嵌入式系统中的重要性。详细说明了移植步骤,包括开发工具准备、项目创建、库文件添加和编译器配置。重点讲解了JSON解析和生成的常用函数,并提供了代码示例。最后强调了堆栈调整和内存释放的注意事项,给出完整应用实例。该方法为嵌入式系统提供了高效的JSON数据处理方案,适用于物联网等场景的数据交换。

嵌入式开发 2911

Cjson移植STM32方法

Cjson移植STM32方法

STM32 JSON例子,数据序列化为Json格式

将数据序列化为JSON格式,序列化操作完成后务使用Myfree()函数来释放内存 void Josn_format() { //cJSON构造方法 cJSON *root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "ADC1", Dev_data.ai1); cJSON_AddNumberToObject(root, "ADC2", Dev_data.ai2); cJSON_AddNumberToObject(root, "ADC3", Dev_data.ai3); cJSON_AddNumberToObject(root,"DI1", Dev_data.input[0]); cJSON_AddNumberToObject(root,"DI2", Dev_data.input[1]); cJSON_AddNumberToObject(root,"DI3", Dev_data.input[2]); cJSON_AddNumberToObject(root,"DI4", Dev_data.input[3]); cJSON_AddNumberToObject(root,"DI5", Dev_data.input[4]); cJSON_AddNumberToObject(root,"DI6", Dev_data.input[5]); cJSON_AddNumberToObject(root,"DI7", Dev_data.input[6]); cJSON_AddNumberToObject(root,"DI8", Dev_data.input[7]); cJSON_AddNumberToObject(root,"DI9", Dev_data.input[8]); cJSON_AddNumberToObject(root,"DI10", Dev_data.input[9]); cJSON_AddNumberToObject(root,"DI11", Dev_data.input[10]); cJSON_AddNumberToObject(root,"DI12", Dev_data.input[11]); cJSON_AddNumberToObject(root,"DI13", Dev_data.input[12]); cJSON_AddNumberToObject(root,"DI14", Dev_data.input[13]); cJSON_AddNumberToObject(root,"DI15", Dev_data.input[14]); cJSON_AddNumberToObject(root,"DI16", Dev_data.input[15]); char *s = cJSON_PrintUnformatted(root); int size=strlen(s)+1; memcpy(Dev_data.json_string,s,size); cJSON_Delete(root); myfree(s); }

保姆级教学,教你在vscode和cursor上调试matlab!!!

保姆级教你如何在vscode或者cursor上面调试matlab

yang_upup的博客 2083

聚宽策略实盘新路径:不开通QMT , 小资金自动化交易解决方案

聚宽策略实盘新路径:不开通QMT , 小资金自动化交易解决方案

u011111246的博客 1468

华为海思2026届数字IC秋招笔试高频考点解析与实战技巧(2025最新版)

本文深入解析华为海思2026届数字IC秋招笔试的高频考点与实战技巧,涵盖时序优化、低功耗设计、DFT规则等核心模块。针对2025年最新真题,提供详细的解题思路和工程经验,帮助考生高效备考。特别关注SystemVerilog约束随机测试等新增考点,助力考生在秋招笔试中脱颖而出。

m2n3o4p5的博客 416

宇树机器人丝滑的二人转动作背后,MPC到底是什么?

了解MPC,让我们闻“机”起舞。

Barok的博客 2145

ASPICE1-配置管理

SUP.8配置管理 BP1:开发配置管理策略 BP2:识别配置项 BP3:建立配置项管理系统 BP4:建立分支管理 BP5:控制变更和发布 BP6: 建立基线 BP7:报告配置项状态 BP8:验证配置项信息 BP9:管理配置项和基线的存储 1.配置管理概念 配置管理(Configuration Management,CM)是通过使用技术或行政手段对软件产品进行控制,以实现对软件开发过程和生命周期进行控制、规范的一系列措施。 完整性、一致性、可控性。 2.配置管理的主要活动: 1.

HDZQ2005的专栏 3687

解决pd.read_json报错ValueError: Trailing data问题

首先,我们使用open函数打开JSON文件,然后使用json.load函数将JSON文件数据解码为Python对象。在使用Python进行数据处理中,我们经常需要将JSON格式的数据读入到DataFrame中进行处理。而使用pandas库的read_json函数,就可以方便地将JSON数据读入到DataFrame中。但是有时候在读取JSON数据时,会遇到一个非常常见的错误:ValueError: Trailing data。这个错误的解决方案并不难,只需要在read_json中添加一个参数即可。

学习使你进步。 2234

ABAP CDS View 从入门到精通教程目录:ABAP CDS View 在 SAP 技术体系中的重要地位

学习 ABAP CDS View 的开发技术,体会其背后的设计理念,也就掌握了 SAP S/4HANA 底层数据模型的设计精髓。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4778

【LaTex】3.5 数据分析

简述了LaTex柱状图、饼图、折线图的画法。

你的指尖有改变世界的力量 5888

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 《信号完整性分析》的读书笔记和总结
下一篇: 随笔:STM32的C语言编写遇到的问题1
Dobolong
博客等级 码龄9年 1016粉丝 23原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值