一、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来进行解析到自己的数据,因此需要有两个函数:
/*********************************
@Function :创建数据结构
*********************************/
char* cJSON_Create_data(void)
/*********************************
@Function :解析数据
*********************************/
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的工程里使用构建数据结构函数来构建发送的数据格式,在上位机中使用解析数据函数来解析数据结构得到自己接收的数据,具体如下:
1.1
STM32函数部分:构建数据结构,即{ “Lsens”:Data_cJSON(传感器数据)}
/*********************************
@Function :创建数据格式
*********************************/
char* cJSON_Create_data(u8 Data_cJSON)
{
cJSON* cjson_test = NULL;
char* str = NULL;
/* 创建一个JSON数据对象(链表头结点) */
cjson_test = cJSON_CreateObject();
/* 添加一条整数类型的JSON数据(添加一个链表节点) */
cJSON_AddNumberToObject(cjson_test, "Lsens", Data_cJSON);
/* 打印JSON对象(整条链表)的所有数据 */
str = cJSON_Print(cjson_test);
free(str);
cJSON_Delete(cjson_test);
return str;
}
/*********************************
@Function :解析数据格式
*********************************/
int Get_cJSON_data(char *message)
{
cJSON* cjson_test = NULL;
cJSON* cjson_Lsens = NULL;
int data = 0;
/* 解析整段JSO数据 */
cjson_test = cJSON_Parse(message);
if(cjson_test == NULL)
{
printf("parse fail.\n");
}
/* 依次根据名称提取JSON数据(键值对) */
cjson_Lsens = cJSON_GetObjectItem(cjson_test, "Lsens");
printf("Lsens:%d\n", cjson_Lsens->valueint);
data = cjson_Lsens->valueint;
return data;
}
2、使用keil提供的JSON库——Jansson
(在工程中添加STM32的JSON库方法见https://blog.csdn.net/yannanxiu/article/details/52712723)
在main.c中添加#include
void jansson_pack_test(void)
{
json_t *root;
char *out;
char buffer[4] = {'t', 'e', 's', 't'};
/* Build an empty JSON object */
root = json_pack("{}");
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
/* Build the JSON object {"foo": 42, "bar": 7} */
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);
/* Like above, ':', ',' and whitespace are ignored */
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);
/* Build the JSON array [[1, 2], {"cool": true}] */
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);
/* Build a string from a non-null terminated buffer */
root = json_pack("[s#]", buffer, 4);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
/* Concatenate strings together to build the JSON string "foobarbaz" */
root = json_pack("[s++]", "foo", "bar", "baz");
out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);
}
在自己实际应用时,根据自己需要来构建数据结构
/*********************************
@Function :使用keil的json库创建数据格式
*********************************/
void jansson_test(u8 Data_cJSON)
{
json_t *root;
char *out;
/* Like above, ':', ',' and whitespace are ignored */
root = json_pack("{si}", "Lsens", Data_cJSON);
out = json_dumps(root, JSON_ENCODE_ANY);
printf("%s\r\n", out);
free(out);
json_delete(root); //先free,再json_delete组合最好,内存才能释放
}