本帖最后由 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申请到内存?
看这样子,应该是这个原因
|
|
没遇到过这种情况