1. 问题现象
2. 问题原因
跟踪调试发现 cJSON大量调用malloc来申请内存,怪不得cjson例子里用完之后要delete对象。原来是要释放内存。STM32里面malloc是在heap也就是堆里面申请内存,因此Heap_Size太小了会导致malloc返回失败,从而导致cJSON_Print(或者cJSON_PrintUnformatted)返回NULL。
3. 解决方法
增加Heap_Size的大小 (>10k,效果会更好),问题就解决了。
char *json_data = cJSON_PrintUnformatted(TCP); //JSON数据结构转换为JSON字符串
4. 示例代码
void test_cjson(void)
{
double grade[4]={66.51,118.52,61.53,128.54};
int time[4]={123,456,789,150};
cJSON *TCP = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(TCP,"name","MQ"); //添加字符串
cJSON_AddNumberToObject(TCP,"age",25); //添加整型数字
cJSON_AddNumberToObject(TCP,"height",183.52); //添加浮点型数字
cJSON_AddFalseToObject(TCP,"gender"); //添加逻辑值false
cJSON *ADD = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(ADD,"country","China"); //添加字符串
cJSON_AddNumberToObject(ADD,"zip-code",123456); //添加整型数字
cJSON_AddItemToObject(TCP,"address",ADD);
cJSON *SUB = cJSON_CreateArray(); //创建一个数组
cJSON_AddStringToObject(SUB,"","政治"); //添加字符串到数组
cJSON_AddStringToObject(SUB,"","数学");
cJSON_AddStringToObject(SUB,"","英语");
cJSON_AddStringToObject(SUB,"","专业课");
cJSON_AddItemToObject(TCP,"subject",SUB); //添加数组到对象
cJSON *TIM = cJSON_CreateIntArray(time,4); //创建一个整型数组
cJSON_AddItemToObject(TCP,"time",TIM);
cJSON *GRA = cJSON_CreateDoubleArray(grade,4); //创建一个双浮点型数组
cJSON_AddItemToObject(TCP,"grade",GRA);
cJSON *STU = cJSON_CreateArray(); //创建一个数组
cJSON *Z3 = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(Z3,"name","张三"); //添加字符串
cJSON_AddNumberToObject(Z3,"age",24); //添加整型数字
cJSON_AddTrueToObject(Z3,"gender"); //添加逻辑值
cJSON_AddItemToArray(STU,Z3); //添加对象到数组中
cJSON *L4 = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(L4,"name","李四"); //添加字符串
cJSON_AddNumberToObject(L4,"age",25); //添加整型数字
cJSON_AddTrueToObject(L4,"gender"); //添加逻辑值
cJSON_AddItemToArray(STU,L4); //添加对象到数组中
cJSON *W5 = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(W5,"name","王五"); //添加字符串
cJSON_AddNumberToObject(W5,"age",26); //添加整型数字
cJSON_AddTrueToObject(W5,"gender"); //添加逻辑值
cJSON_AddItemToArray(STU,W5); //添加对象到数组中
cJSON_AddItemToObject(TCP,"student",STU); //添加数组到对象中
char *json_data = cJSON_PrintUnformatted(TCP); //JSON数据结构转换为JSON字符串
printf("%s\n",json_data);//输出字符串
free(json_data);
cJSON_Delete(TCP);//清除结构体
}
5. 特别声明
程序最后一定要cJSON_Delete 删除对象。
还有cJSON_Print(或者cJSON_PrintUnformatted)会一直不停申请内存,所有调用完之后一定要free释放,否则多次调用后一样会内存溢出。导致后面的cJSON_Print(或者cJSON_PrintUnformatted)会申请不到内存。
char *json_data = cJSON_PrintUnformatted(TCP); //JSON数据结构转换为JSON字符串
printf("%s\n",json_data);//输出字符串
free(json_data);
cJSON_Delete(TCP);//清除结构体
6. json在线解析工具
https://www.sojson.com/simple_json.html
参考资料:
CJSON库中,cJSON_PrintUnformatted()函数内存泄漏相关问题
https://blog.csdn.net/weixin_38537639/article/details/119932978?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-4.no_search_link&spm=1001.2101.3001.4242.4