打印
[STM32F1]

cjson使用时的问题

[复制链接]
574|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
                        
   
cJSON *request = NULL;
cJSON *response = NULL;

if(strcmp("set",action->valuestring)==0 && mode != 0)                                //action的值与"set"一样
                        {
                                cJSON_AddStringToObject(response, "action", "set");
                        }
                        else if(strcmp("get",action->valuestring)==0)                                        //action的值与"get"一样
                        {
                                cJSON_AddStringToObject(response, "action", "get");
                        }

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

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

                        /********************** time 对象 ************************/
                        time = cJSON_CreateObject();                                                        //创建time对象
                        memset(buffer, '\0', sizeof(buffer));
                        sprintf(buffer, "%d", Set_Time_Value);
                        cJSON_AddStringToObject(time, "set", buffer);                                        //添加set:value键值对
                        memset(buffer, '\0', sizeof(buffer));
                        if (Set_Time_Value != 0)
                                sprintf(buffer, "%d", ShengYu_Time_Min);
                        else
                                sprintf(buffer, "%d", 0);
                        cJSON_AddStringToObject(time, "remain", buffer);                                        //添加remain键值对
                        cJSON_AddItemToObject(response, "time", time);                                        //为response对象,中添加time对象

                        /********************** temperature 对象 ************************/
                        temperature = cJSON_CreateObject();
                        memset(buffer, '\0', sizeof(buffer));
                        sprintf(buffer, "%d", Set_Temp_Value);
                        cJSON_AddStringToObject(temperature, "set", buffer);
                        memset(buffer, '\0', sizeof(buffer));
                        sprintf(buffer, "%d", Temperature);
                        cJSON_AddStringToObject(temperature, "current", buffer);
                        cJSON_AddItemToObject(response, "temperature", temperature);
                }
        }

        char *string;
        string = cJSON_PrintUnformatted(response);
debug看一下。如下图,当收到get指令的时候,request,response,string都有地址
当收到set指令的时候,request,response有地址,但是string没有。(set指令比get长,所以json化后占的内存多)

再看response内部各json结构体的地址,发现好像最后一个时membase+576,这是内存快用完了的意思吗?
所以在cJSON_AddStringToObject的时候,没有给string申请到内存?




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






使用特权

评论回复
评论
dirtwillfly 2020-9-21 18:37 回复TA
没遇到过这种情况 
来自 2楼
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

粉丝