You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:10:09