一、cJSON介绍 cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。 cJSON的源码文件只有两个: 1. cJSON.h 2. cJSON.c 使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可 具体的介绍请看(https://blog.csdn.net/Mculover666/article/details/103796256),此博客对JSON与cJSON的介绍很详细,我的文章主要进行应用。 二、基于VS的应用 将cJSON.h与 cJSON.c添加到工程文件中,实现构建数据结构以及解析数据的功能,对于cJSON的应用,主要是使用cJSON构建自己的数据结构体,然后使用cJSON来进行解析到自己的数据,因此需要有两个函数:
char* cJSON_Create_data(void)
void Get_cJSON_data(char *message)
1、创建数据结构,将自己的数据构建数据结构,进行发送或存储
{
"name": "mculover666",
"age": 22,
"number": 300,
"weight": 55.500000,
"address": {
"country": "China",
"zip-code": 111111
},
"skill": ["C", "Java", "Python"],
"student": false
}
2、解析创建的数据结构,得到接收的数据
name: mculover666
age:22
number:300
weight:55.5
address-country:China
address-zipcode:111111
skill:[C,Java,Python]
student: false
3、应用工程 这个基于VS2012的工程可以直接下载使用,下载链接如下: https://download.csdn.net/download/liujunping11/32672969 二、基于STM32的应用 基于STM32对于cJSON数据格式的应用有两种方式,一种是将cJSON.h与 cJSON.c添加到STM32的工程中,另一种是使用STM32自己的JSON库进行应用,以下回介绍两种方式。 STM32的cJSON的应用主要基于STM32将传感器检测到的数据发送到串口,然后设计上位机来解析串口的数据来进行演示,达到数据通信的应用形式。 1、将cJSON.h与 cJSON.c添加到STM32的工程 将cJSON.h与 cJSON.c添加到STM32的工程,跟上面类似,在STM32的工程里使用构建数据结构函数来构建发送的数据格式,在上位机中使用解析数据函数来解析数据结构得到自己接收的数据,具体如下:
char* cJSON_Create_data(u8 Data_cJSON)
{
cJSON* cjson_test = NULL;
char* str = NULL;
cjson_test = cJSON_CreateObject();
cJSON_AddNumberToObject(cjson_test, "Lsens", Data_cJSON);
str = cJSON_Print(cjson_test);
free(str);
cJSON_Delete(cjson_test);
return str;
}
- 1.2
上位机函数部分:上位机我使用QT写了一个串口小工具,使用数据解析函数来解析在STM32中构建的数据结构得到传感器数据,继而在QT的串口小工具中显示STM32数据,即解析{ “Lsens”:Data_cJSON(传感器数据)}中的Data_cJSON
int Get_cJSON_data(char *message)
{
cJSON* cjson_test = NULL;
cJSON* cjson_Lsens = NULL;
int data = 0;
cjson_test = cJSON_Parse(message);
if(cjson_test == NULL)
{
printf("parse fail.\n");
}
cjson_Lsens = cJSON_GetObjectItem(cjson_test, "Lsens");
printf("Lsens:%d\n", cjson_Lsens->valueint);
data = cjson_Lsens->valueint;
return data;
}
- 1.3
上位机串口接收到的部分:如下图所示,其中{ “Lsens”:13}、{ “Lsens”:11}为STM32发送的数据结构,13、11为Qt解析的数据值。
2、使用keil提供的JSON库——Jansson (在工程中添加STM32的JSON库方法见https://blog.csdn.net/yannanxiu/article/details/52712723) 在main.c中添加#include <jansson.h>,keil的JSON库构建数据结构函数与cJSON不同,如下:
void jansson_pack_test(void)
{
json_t *root;
char *out;
char buffer[4] = {'t', 'e', 's', 't'};
root = json_pack("{}");
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
root = json_pack("{sisi}", "foo", 42, "bar", 7);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
root = json_pack("{s:i, s:i}", "foo", 42, "bar", 7);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
root = json_pack("[[i,i],{s:b}]", 1, 2, "cool", 1);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
root = json_pack("[s#]", buffer, 4);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
root = json_pack("[s++]", "foo", "bar", "baz");
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
}
在自己实际应用时,根据自己需要来构建数据结构
- 2.1
STM32函数部分:构建{ “Lsens”:Data_cJSON(传感器数据)}
void jansson_test(u8 Data_cJSON)
{
json_t *root;
char *out;
root = json_pack("{si}", "Lsens", Data_cJSON);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("%s\r\n", out);
free(out);
json_delete(root);
}
- 2.2
上位机函数部分:解析{ “Lsens”:Data_cJSON(传感器数据)}中的Data_cJSON,Qt解析部分不变,效果如下 3、应用工程 STM32工程以及Qt部分下载链接如下: 基于STM32的cJSON应用 https://download.csdn.net/download/liujunping11/33143631 基于Qt上位机解析cJSON的串口小工具 https://download.csdn.net/download/liujunping11/33143700
|