在Keil环境中将cJSON添加到STM32项目

背景知识什么是JSON? JSON是指JavaScript对象表示法(JavaScript& Object& nbsp; Notation)是一种轻量级的文本数据交换格式。

JSON比XML更小,更快,更易于解析。

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

数据在名称/值对中。

数据用逗号分隔。

大括号被保存。

括号将保存在数组中。

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

JSON是一种轻量级的数据交换格式。

在这里,我将不做详细分析,只是简单地了解它是Internet上的一种数据打包协议,它使人们可以更方便地进行读写。

以下是阿里云IoT简化的对象模型信息的json格式,如下所示:简化的对象模型:对象模型是对云中设备功能的描述,包括设备的属性,服务和事件。

IoT平台通过使用JSON格式定义对象的描述语言TSL(事物规范语言)来描述对象模型,并且您可以根据TSL组装和报告设备数据。

您可以导出完整的对象模型以进行云应用程序开发;您还可以仅导出压缩对象模型,并与设备端SDK协作以实现设备开发。

{“属性”:[{“标识符”:“ WaterConsumption”,“ dataType”:{“ type”:“ float”}},{“标识符”:“ ValveSwitch”,“ dataType” ;:{“ type”:“ enum”}}}}& nbsp;如果仔细观察,每个数据之间的关系实际上是很明显的。

在json中,一切都是对象,因此任何受支持的数据类型都可以用JSON表示,例如字符串,数字,对象和数组。

JSON本质上是一个字符串,而json对象是其元素。

& nbsp; & nbsp;从上面的分析中,我们可以知道,对json的分析只是从一堆字符串中过滤出您需要的信息。

这听起来很简单,但实现起来并不简单,因为字符串过滤函数本身很困难,并且对象的顺序可能不同,中间没有空格,值是整数或浮点数数字,这是一个正数,或一个负数,这些都是很麻烦的,如果我们的数据格式是固定的,但是稍有变化,它将非常麻烦,因此编写具有强大兼容性的json解析程序是非常困难的,而且cJSON特别用于解析JSON字符串,因为它简洁,简单,高效且易于移植。

只需要一个cJSON.c和cJSON.h文件。

STM32 cJSON移植步骤:1.下载JSON文件:链接:& nbsp; & nbsp; & nbsp; & nbsp; https://sourceforge.net/projects/cjson/等到倒计时到0为止进行下载:2.将整个cJSON源文件复制到项目中的根目录下:3.将cJSON文件夹添加到“包含路径”:4.添加项目的cJSON.c文件夹:添加完成后,项目目录显示格式:5.修改源代码,因为我使用的是Punctual Atom的STM32项目文件已通过测试。

它们具有自己定义的malloc.c和malloc.h。

我们用自己的替换了原来的cJSON中的malloc和free,如下所示:更改为:6.应用示例(1),main。

添加引用头文件#include“ cJSON.h”;在c文件(2)中,写入测试代码main.c #include“ sys.h” #include“ delay.h” #include“ usart.h” #include“ string”。

h” #include& lt; stdio.h& gt; #include“ cJSON.h” void void ParseStrDemo(void){char strArr [] =“ {” name”:“ Andy”,“ age”:20 }”; cJSON * str_json,* str_name,* str_age; printf(“ strArr []:%s ",strArr); str_json = cJSON_Parse(strArr); //创建一个JSON解析对象,如果(!str_json){printf(" JSON格式错误:%s, ”,cJSON_GetErrorPtr()); //输出json格式错误信息}否则{printf(" JSON格式正确: %s ",cJSON_Print(str_json)); str_name = cJSON_GetObjectItem(str_json,“名称”); //如果(str_name-& gt; type == cJSON_String){printf(" Name:%s " str_name-> valuestring);} str_age = cJSON_GetObjectItem(str_json,“ age”)); //获取有关与年龄键对应的值的信息if(str_age-& gt; type == cJSON_Number){printf(“ age:%d " str_age-& gt; valueint);} cJSON_Delete(str_json); //释放内存}} int main(void){while(1){ParseStrDemo(); delay_ms(1000);}}(3),测试结果7,JSON应用程序放置物联网云下游有效负载数据包,解析自定义JSON格式的通信