cJSON 是一个非常好的库,简单整洁,但需要了解一些事情:
cJSON_GetObjectItem(command,"param1")->valuestring
是一个char *
,在这个例子中解析后。
由于您将其替换为"new value 1"
, const char *
,因此在删除 时jsonMsg
,删除命令会尝试释放该const char *
,从而导致分段错误。
有几种方法:
char* jsonStr = "{ \"command\" : { \"param1\": \"value1\", \"param2\": \"value2\" } }";
cJSON *jsonMsg = cJSON_Parse(jsonStr);
cJSON *command = CJSON_GetObjectItem(jsonMsg, "command");
到这里为止,
然后是一个简单的命令:
cJSON_ReplaceItemInObject(command,"param1", cJSON_CreateString("new value 1"));
和完成:
cJSON_Print(jsonMsg);
cJSON_Delete(jsonMsg);
或者
cJSON_DeleteItemFromObject(command,"param1");
cJSON_AddItemToObject(command,"param1",cJSON_CreateString("new value 1"));
或者
如果你坚持手动操作,ok:
free(cJSON_GetObjectItem(command,"param1")->value string);
cJSON_GetObjectItem(command,"param1")->valuestring=strdup("new value 1");
但是如果您手动操作,则应type cJSON_IsReference
在尝试释放之前检查,其次strdup
将分配新内存以复制“新值 1”。