当前位置:首页 > 嵌入式 > 程序员小哈
[导读]背景知识    什么是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获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

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

嵌入式系统的算法效率与硬件资源的平衡是核心挑战。STM32微控制器通过零开销循环机制与DWT计数器的结合,为算法优化提供了硬件级支持。本文以插入排序算法为例,探讨如何利用STM32的硬件特性验证排序阈值,实现性能与代码复...

关键字: STM32 DWT

智能家居与工业控制场景,手势识别作为非接触式交互的核心技术,正从实验室走向消费级应用。以STM32F407VET6微控制器与TensorFlow Lite Micro框架的组合为例,通过模型量化、硬件加速与低功耗设计,可...

关键字: STM32 TensorFlow

在高性能电机驱动的“纳秒级战争”中,浮点运算单元(FPU)往往成为制约控制环带宽的阿喀琉斯之踵。当PWM载波频率攀升至100kHz,留给电流环PID、Clarke/Park变换及SVPWM计算的时间窗口仅剩寥寥数微秒。此...

关键字: 电机控制算法 FOC磁场 STM32

在工业控制、电机驱动等实时性要求严苛的场景中,中断响应延迟直接影响系统精度与稳定性。STM32系列微控制器凭借Cortex-M内核的硬件特性,通过合理的系统架构设计可实现微秒级中断响应。本文从硬件配置、中断处理、代码优化...

关键字: 裸机开发 STM32

在工业控制、音频处理等高性能嵌入式场景中,某电机驱动项目通过混合使用寄存器操作与CMSIS-DSP库,将PID控制周期从120μs缩短至38μs,系统响应速度提升3倍。本文将揭秘这种"底层+高层"混合编程模式的核心技巧。

关键字: HAL STM32 寄存器

嵌入式系统开发手势识别作为非接触式人机交互的核心技术,正从实验室走向消费级应用。然而,传感器采集的原始信号常因电磁干扰、电源噪声或机械抖动产生失真,导致识别准确率下降。本文以STM32微控制器与PAJ7620手势识别传感...

关键字: STM32 手势识别 噪声

在物联网设备开发中,快速实现稳定可靠的网络通信是项目成功的关键。W5500作为一款集成硬件TCP/IP协议栈的以太网控制器,凭借其"开箱即用"的特性,可大幅缩短STM32平台的网络功能开发周期。本文通...

关键字: STM32 W5500

工业物联网设备开发中,某智能电表项目曾因ADC采样中断响应延迟导致数据丢失率高达15%。技术人员通过重构DMA驱动架构,将数据搬运效率提升12倍,CPU占用率从38%降至3%,成功解决高速采样场景下的实时性难题。这一案例...

关键字: STM32 DMA

工业机器人关节控制系统中,一个典型的伺服驱动器需要在100μs周期内完成电流采样、位置反馈、PID计算和PWM输出等12项关键任务。当传统固定优先级调度导致机械臂出现0.3°的位置抖动时,某运动控制厂商通过引入混合排序算...

关键字: 电机控制 STM32

在STM32嵌入式系统开发中,排序算法的效率直接影响传感器数据处理、通信协议解析等核心任务的实时性。传统快速排序在部分有序数据场景下易退化为O(n²)时间复杂度,而单纯依赖三数取中法优化基准值选择仍存在小规模数据效率不足...

关键字: STM32 传感器
关闭