cjson是一个开源的C文件,可以实现用C语言生成json格式数据,
步骤1:准备工作
在keil里添加cjson.c和cjson.h,cjson文件下载,使用微云,不要积分
main.c里引用cjson.h
#include <I:\cjson\test_cjson\cJSON.h>
步骤2:cjson函数简单讲解
首先需要创建一个cjson的指针,用于存储数据,
cJSON *cjson_head=NULL;
然后使用添加函数,添加数字和字符要使用不同的函数,
#添加字符
cJSON_AddStringToObject(cjson_head, "name", "mculover666");
#添加数字
cJSON_AddNumberToObject(cjson_head,"age",22);
完成后,想使用json时,因为是一个指针,无法直接使用,需要用一个字符串接收格式化后的json格式
char *str=NULL;
str = cJSON_Print(cjson_head);
printf("%s\n", str);
此时,直接使用str即可,通过串口输出或者通过4G发送,MQTT发送等等。
更复杂的,json格式可以嵌套,这会在步骤3里展示。
步骤3:一个例子, 生成json格式数据
#include <I:\cjson\test_cjson\cJSON.h>
#include <stdio.h>
#创建cjson的指针,用于存储数据,可以创建多个
cJSON *cjson_head=NULL;
cJSON *cjson_address=NULL;
cJSON *cjson_skill=NULL;
char *str=NULL;
int main()
{
cjson_head=cJSON_CreateObject();
// add string to cjson
cJSON_AddStringToObject(cjson_head, "name", "mculover666");
//add number to cjson
cJSON_AddNumberToObject(cjson_head,"age",22);
//add float to cjson
cJSON_AddNumberToObject(cjson_head, "weight", 55.5);
/* 添加一个嵌套的JSON数据(添加一个链表节点) */
cjson_address = cJSON_CreateObject();
cJSON_AddStringToObject(cjson_address, "country", "China");
cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
cJSON_AddItemToObject(cjson_head, "address", cjson_address);
/* 添加一个数组类型的JSON数据(添加一个链表节点) */
cjson_skill = cJSON_CreateArray();
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" ));
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Java" ));
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
cJSON_AddItemToObject(cjson_head, "skill", cjson_skill);
/* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
cJSON_AddFalseToObject(cjson_head, "student");
/* 打印JSON对象(整条链表)的所有数据 */
str = cJSON_Print(cjson_head);
printf("%s\n", str);
return 0;
}
运行结果为
{
"name": "mculover666",
"age": 22,
"weight": 55.5,
"address": {
"country": "China",
"zip-code": 111111
},
"skill": ["C", "Java", "Python"],
"student": false
}
如果有帮到你,请点个赞。
8.14更新
很多人反馈打印出来有乱码,有多种可能,
第一步:首先排除波特率和串口问题,确认硬件没问题后进行下一步
第二步:先尝试一个小的json数组能否正常运行,例如:
{
"name": "mculover666"
}
确认代码是否正常执行,
这是因为STM32 的内存资源有限,特别是在堆内存分配上。在使用 cJSON 库时需要确保有足够的内存来存储 JSON 数据。如果内存不足,可能会导致分配失败,从而导致乱码或崩溃。
第三步:检查堆栈大小,如果你的json数组很大,会占用很多内存,参考评论区意见,需要增加STM32的堆栈大小,可以搜索一下,这里不再教如何调整堆栈大小了。