[STM32F1] cjson使用时的问题

[复制链接]
749|4
 楼主| djz1992 发表于 2020-9-21 11:42 | 显示全部楼层 |阅读模式
本帖最后由 djz1992 于 2020-9-21 14:45 编辑

在用cjson解析和生成json字符串的时候,遇到了一个问题;
解析过程中对set命令和get命令做了不同的处理,定义了不同的response
在使用cJSON_PrintUnformatted生成response字符串的时候,针对get的回复,可以正常生成,*string的内容 是个字符串
但是针对set的response回复,没法生成,*string 的内容就是一个0。
很奇怪啊,关键是不同的地方只有cJSON_AddStringToObject(response, "action", "set");和cJSON_AddStringToObject(response, "action", "get");


为什么会这样呢?
@dirtwillfly @m564522634 @ufbycd @xyz549040622
  1.                         
  2.    
  3. cJSON *request = NULL;
  4. cJSON *response = NULL;

  5. if(strcmp("set",action->valuestring)==0 && mode != 0)                                //action的值与"set"一样
  6.                         {
  7.                                 cJSON_AddStringToObject(response, "action", "set");
  8.                         }
  9.                         else if(strcmp("get",action->valuestring)==0)                                        //action的值与"get"一样
  10.                         {
  11.                                 cJSON_AddStringToObject(response, "action", "get");
  12.                         }

  13.                         /************************************************/
  14.                         cJSON_AddStringToObject(response,"version",VERSION);                                //为response对象添加一个键值对
  15.                         memset(buffer, '\0', sizeof(buffer));

  16.                          sprintf(buffer, "%d", mode);
  17.                         cJSON_AddStringToObject(response, "workmode", buffer);

  18.                         /********************** time 对象 ************************/
  19.                         time = cJSON_CreateObject();                                                        //创建time对象
  20.                         memset(buffer, '\0', sizeof(buffer));
  21.                         sprintf(buffer, "%d", Set_Time_Value);
  22.                         cJSON_AddStringToObject(time, "set", buffer);                                        //添加set:value键值对
  23.                         memset(buffer, '\0', sizeof(buffer));
  24.                         if (Set_Time_Value != 0)
  25.                                 sprintf(buffer, "%d", ShengYu_Time_Min);
  26.                         else
  27.                                 sprintf(buffer, "%d", 0);
  28.                         cJSON_AddStringToObject(time, "remain", buffer);                                        //添加remain键值对
  29.                         cJSON_AddItemToObject(response, "time", time);                                        //为response对象,中添加time对象

  30.                         /********************** temperature 对象 ************************/
  31.                         temperature = cJSON_CreateObject();
  32.                         memset(buffer, '\0', sizeof(buffer));
  33.                         sprintf(buffer, "%d", Set_Temp_Value);
  34.                         cJSON_AddStringToObject(temperature, "set", buffer);
  35.                         memset(buffer, '\0', sizeof(buffer));
  36.                         sprintf(buffer, "%d", Temperature);
  37.                         cJSON_AddStringToObject(temperature, "current", buffer);
  38.                         cJSON_AddItemToObject(response, "temperature", temperature);
  39.                 }
  40.         }

  41.         char *string;
  42.         string = cJSON_PrintUnformatted(response);
debug看一下。如下图,当收到get指令的时候,request,response,string都有地址 json1.png
当收到set指令的时候,request,response有地址,但是string没有。(set指令比get长,所以json化后占的内存多)
json2.png
再看response内部各json结构体的地址,发现好像最后一个时membase+576,这是内存快用完了的意思吗?
所以在cJSON_AddStringToObject的时候,没有给string申请到内存?
json3.png



看这样子,应该是这个原因






评论

没遇到过这种情况  发表于 2020-9-21 18:37
 楼主| djz1992 发表于 2020-9-21 14:46 | 显示全部楼层
        if (request != NULL)
                cJSON_Delete(request);

        char *string;
        string = cJSON_PrintUnformatted(response);

在cJSON_PrintUnformatted前,先把request的内存释放就好了。不要在退出函数的时候在释放。
huangcunxiake 发表于 2020-9-21 15:16 | 显示全部楼层
没用过。
单片小菜 发表于 2020-9-21 21:16 | 显示全部楼层
你没有释放内存空间,当然会出现问题了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:人生苦短,冬日苦长,正是青葱,却无骄阳

115

主题

620

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部