如何正确实现cJSON_AddObjectToObject?嵌套JSON对象添加失败排查
问题分析与解决
你遇到的核心问题是调用了错误的cJSON函数:cJSON_AddObjectToObject(data, "camera1")会直接在data中创建一个空的新对象并命名为camera1,完全忽略了你之前创建好的camera1对象。
错误原因
cJSON_AddObjectToObject(parent, key):该函数的作用是新建一个空JSON对象,并将这个空对象作为key对应的value添加到父对象中,和你之前创建的camera1变量没有任何关联。- 代码末尾的
cJSON_Delete(json);是笔误,应该删除的是根对象data。
修正后的代码
#include <stdio.h> #include "cJSON.h" int main() { cJSON *data = cJSON_CreateObject(); cJSON_AddStringToObject(data, "target_list", "hce"); cJSON_AddStringToObject(data, "source", "vas"); cJSON_AddNumberToObject(data, "command_type", 2); cJSON *camera1 = cJSON_CreateObject(); cJSON_AddNumberToObject(camera1, "cam_id", 1); cJSON_AddStringToObject(camera1, "url", "rtsp://ip:port/xxxxx"); cJSON_AddNumberToObject(camera1, "enable_disable_flag", 1); // 用正确的函数将已创建好的camera1对象添加到data中 cJSON_AddItemToObject(data, "camera1", camera1); // 转换为JSON字符串 char *json_str = cJSON_Print(data); printf("%s\n", json_str); // 释放资源 cJSON_free(json_str); cJSON_Delete(data); // 修正笔误,删除根对象data return 0; }
修正后输出结果
{ "target_list": "hce", "source": "vas", "command_type": 2, "camera1": { "cam_id": 1, "url": "rtsp://ip:port/xxxxx", "enable_disable_flag": 1 } }
补充说明
cJSON_AddItemToObject(parent, key, item):该函数会将你已经创建好的item对象添加到parent中,并将item的所有权转移给parent,后续只需要删除根对象data即可自动释放camera1的内存,不需要单独删除camera1。- 如果不想转移所有权(比如
camera1还要被其他地方使用),可以用cJSON_AddItemReferenceToObject(data, "camera1", camera1),但此时需要手动管理camera1的内存释放。
内容的提问来源于stack exchange,提问作者batuman
相关产品推荐
相关产品推荐

