当前位置:首页 > 嵌入式 > 程序员小哈
[导读]背景知识    什么是JSON? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) 是轻量级的文本数据交换格式,JSON 比 XML 更小、更快,更易解析。 JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集。 数据在名称/值对中 数据由逗号分

背景知识   


什么是JSON?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)

  • 是轻量级的文本数据交换格式,JSON 比 XML 更小、更快,更易解析。


JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中

  • 数据由逗号分隔

  • 大括号保存对象

  • 中括号保存数组


JSON 值可以是:字符串, 数字, 对象, 数组, 布尔值 或 null 


JSON是一种轻量级的数据交换格式,这里不做详细的分析,简单的理解为,是互联网上的一种数据打包协议,比较方便人阅读和编写,下面是阿里云物联网精简物模型信息的json格式,如下所示:



精简物模型:

物模型是对设备在云端的功能描述,包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL (即Thing Specification Language),采用JSON格式,您可以根据TSL组装上报设备的数据。您可以导出完整物模型,用于云端应用开发;您也可以只导出精简物模型,配合设备端SDK实现设备开发。

{ "properties": [ { "identifier": "WaterConsumption", "dataType": { "type": "float" } }, { "identifier": "ValveSwitch", "dataType": { "type": "enum" } } ]}

   如果仔细看,其实各个数据关系还是比较明显的。在json中,一切都是对象(object),因此任何支持的数据类型,都是可以通过JSON来表示的,例如字符串、数字、对象、数组。JSON本质是一个字符串,而json的对象则是其中的元素。


    从上面的分析,我们可以知道,对于json的解析,简单的讲就是从一堆字符串中,筛选出自己需要的信息。这个听起来很简单,真正实现起来却不是那么简单,因为字符串筛选功能本身就很难,再加上其中的对象排列顺序可能不同,中间有没有空格,数值是整数、还是浮点数,是正数,还是负数,这些都是很麻烦的,如果我们的数据格式是固定的还好,但是稍微有一点变动,就会很麻烦,所以写出一个兼容性很强的json解析程序, 还是比较难的,而cJSON就是一个专门用来解析JSON字符串的,因为简洁又简单,效率还快,移植也特别方便,只需要一个cJSON.c和cJSON.h文件。



STM32 cJSON移植步骤:

1、下载JSON文件:

链接:         https://sourceforge.net/projects/cjson/



等到倒计时到0即可下载:




2、拷贝整个cJSON源文件到工程的根目录下:



3、添加cJSON文件夹至Include Paths:


4、添加cJSON.c文件夹至工程中:


添加完毕之后,工程目录显示格式:



5、修改源代码

因为我用的是正点原子的STM32 工程文件做测试,他们有自己定义的malloc.c、malloc.h,

我们把原本的cJSON中的malloc 和free替换成我们自己的,如下代码:

更改为:


6、应用实例

(1)、main.c文件中添加引用头文件

#include "cJSON.h"

(2)、编写测试代码 main.c

#include "sys.h"#include "delay.h"#include "usart.h"#include "string.h" #include <stdio.h>#include "cJSON.h"void ParseStrDemo(void){ char strArr[] = "{\"name\":\"Andy\",\"age\":20}"; cJSON *str_json, *str_name, *str_age;  printf("strArr[]:%s \r\n",strArr);  str_json = cJSON_Parse(strArr); //创建JSON解析对象,返回JSON格式是否正确 if (!str_json) { printf("JSON格式错误:%s \r\n", cJSON_GetErrorPtr()); //输出json格式错误信息 } else { printf("JSON格式正确:\n%s \r\n",cJSON_Print(str_json) ); str_name = cJSON_GetObjectItem(str_json, "name"); //获取name键对应的值的信息 if (str_name->type == cJSON_String) { printf("姓名:%s \r\n", str_name->valuestring); } str_age = cJSON_GetObjectItem(str_json, "age"); //获取age键对应的值的信息 if(str_age->type==cJSON_Number) { printf("年龄:%d \r\n", str_age->valueint); } cJSON_Delete(str_json); //释放内存 }}int main(void){ while(1) { ParseStrDemo();  delay_ms(1000); } }


(3)、测试结果


7、JSON应用的地方

  • IoT云端下行的payload数据包解析

  • 自定义JSON格式通讯协议

  • 设备间参数传递

  • API接口返回值,比如大部分天气API

  • 网络数据传输


8、在线JSON校验格式化工具

http://www.bejson.com/

该网址可以压缩JSON字符串,校验JSON字符串是否合法。




喜欢请关注微信公众号:程序员小哈  

如果对您有所帮助,请帮忙转发一下呗

有啥想玩的模块,留言给我,咱们一起玩


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在STM32嵌入式开发中,动态内存管理是提升系统灵活性的关键技术,但内存泄漏与碎片化问题始终是开发者面临的两大挑战。本文将结合位图内存池设计与Chrom-GRC™工具链,提出一套完整的解决方案,实现内存资源的高效利用与实...

关键字: 动态内存池 STM32

在工业控制、机器人运动等实时性要求严苛的场景中,STM32的GPIO中断响应时间直接影响系统性能。本文以STM32F4系列为例,结合硬件同步机制与软件优化策略,系统阐述中断响应时间从数百纳秒优化至200ns以内的全流程。

关键字: STM32 GPIO

本实验活动的目的是利用STM32和嵌入式C编程在基于微控制器的系统上探索和实现实时操作系统(RTOS)。具体来说,本实验演示了使用FreeRTOS来管理多个并发任务,确保确定性执行,适当的资源共享和有效的电源利用。

关键字: STM32 嵌入式 C语言

这个项目的重点是建立一个简单但功能强大的嵌入式系统,测量环境条件并实时显示它们。使用RT - Spark开发板作为主控制器,系统从AHT21数字传感器读取温度和湿度数据,并将结果输出到板的LCD模块。

关键字: STM32 嵌入式 AHT21数字传感器

FreeRTOS是一个轻量级、开源的实时操作系统内核,专为微控制器和小型嵌入式系统设计。它提供基本的RTOS特性,如任务调度、任务间通信、同步机制和低功耗管理,同时保持最小的内存占用。

关键字: STM32 单片机 FreeRTOS

系统通过AHT21传感器连续测量周围环境的温度和湿度。STM32不使用内置库,而是通过定制软件I²C(位敲击)驱动程序与传感器通信,从而完全控制时序和数据传输。

关键字: STM32 AHT21传感器 LCD

针对轨道交通领域封闭车厢环境中火灾 、异常震动等多重安全隐患 , 采用STM32F103C8T6微控制器作为主控芯片 ,设计了一种智能安防系统。该系统集成温度DS18B20、烟雾MQ-2、震动SW-18010P及火焰传感...

关键字: STM32 传感器 列车安防 远程监控 物联网

开源运动控制卡正以开放架构与灵活定制的优势,成为打破国外技术垄断的破局者。基于STM32微控制器的开发方案,凭借其高性能、低功耗与丰富的外设资源,为运动控制提供了高性价比的实现路径。从3D打印机的精密挤出到CNC机床的多...

关键字: 开源运动控制 STM32
关闭