JSON(JavaScript Object Notation)是一个轻量级的数据交换格式。既便于开发者读写,也便于机器分析和构建。它独立于
开发语言,是一种文本格式,很适用描述在各个系统间交换的数据。
CJSON是一个轻量级的JSON解析库,广泛应用于嵌入式系统中。它支持JSON格式的数据解析和生成,能够在资源受限的环境中高效运行,是物联网设备中处理数据的理想选择。随着物联网和边缘计算的兴起,CJSON的这一特点显得尤为重要。
本篇帖子就来手把手讲解如何在RA4M2开发板上移植使用cJSON.
CJSON的官网链接如下:
https://github.com/DaveGamble/cJSON

大家先把它下载下来
我们只需要使用其中的两个文件cJSON.c和cJSON.h,其它的删除

1。先把cJSON复制到串口工程目录下,在KEIL中添加路劲和文件。建立串口我之前写了很多帖子了,就不重复造轮子,只讲重点!!!

Cjson 只有一个 C 文件 Cjson.C 和一个头文件 Cjson.h。所以只需要将这两个文件拷贝到工程文件夹中,并将 Cjson.C 添加到
工程中就可以了。

2。添加头文件
#include "hal_data.h"
#include <stdio.h>
#include "usart9.h"
#include "esp8266.h"
#include "cJSON.h"
这是我的工程
3。首先来分析下cJSON的语法和格式
JSON 格式的数据看起来就像下面这个样子:
{
“home”: {
“LED”: “on”,
“Temperature”: “25”
}
}
这个 JSON 数据描述的是 home 的 LED 灯状态以及温度值。它由一组“名称(key)”以及对应的“ 值(value)”组成。
“名称”和“ 值”之间由“ :”分开。各组“名称:值”对之间由“,”符号进行分割。

next 和prev 指针可以用来遍历“矩阵”或者“对象”类型的 JSON 数据链表;这两种类型的 JSON 数据还会有一个子数据
指针*child
type : 表示该 json 数据的类型,比如数字,字符串、矩阵、对象等
valuestring, valueint, valuedouble 和string 指针分别指向该 json 数据类型具体的值,视其类型而定。
使用 cjson 生成 json 数据
下面我们看看如何使用 cjson 来生成下面的数据:
{
“reported”: {
“LED”: “on”,
“status” : “normal”
}
}
cJSON * reported_obj;
cJSON * device_obj;
reported_obj = cJSON_CreateObject();
device_obj = cJSON_CreateObject();
//add LED status
if(flag_led)
cJSON_AddStringToObject(reported_obj, "LED", "on");
else
cJSON_AddStringToObject(reported_obj, "LED", "off");
//add device status
cJSON_AddStringToObject(reported_obj,"status", "normal");
cJSON_AddItemToObject(device_obj, "reported", reported_obj);
cjson_print_buf = cJSON_Print(device_obj);
if(cjson_print_buf!=NULL)
{
snprintfreturn = snprintf(buf,bufsize,cjson_print_buf);
cJSON_free(cjson_print_buf);
}
cJSON_Delete(device_obj);
4。使用 cjson 解析 json 数据
可以通过 cJSON_Parse()函数来解析接收到的 json 数据,cJSON_Parse()函数会对数据进行解析,并申请一段内存保存解析
后的 cjson 的数据结构,并返回指针。通过 cJSON_GetObjectItem()函数可以获取解析后的 cjson 数据结构中的第一级子对象。使用 cJSON_Parse()后,切记也一定要通过 cJSON_Delete 释放之前所申请的内存。
下面代码是对收到的 json 数据的解析过程。收到的数据内容为:
char json_string1[] =
"{
"cmd":141,
"device":"lamp",
"power":1,
"brightness":50
}";

打开串口助手查看数据

为了方便大家查看,我把代码改成这样


这样大家就很好理解了,查看串口助手


cJSON 代码量不大,用起来也方便。使用的时候一定要注意前面提到对使用完的内存空间进行释放。否则会造成内存泄漏。