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

如何创建并填充jsoncpp数组?代码运行崩溃求排查

问题分析与解决方案

你的代码崩溃的核心原因是搞错了JsonCpp数组的访问层级,咱们来一步步拆解问题:

先看你代码里的关键错误点:

parts["parts"] = Json::arrayValue;
// ...
parts[idx]["part"] = partInfo;

你把parts定义成了一个Json对象,并且给它的"parts"字段赋值为数组,但后续却直接通过parts[idx]去访问——Json对象是键值对结构,不是数组,这种索引访问会触发未定义行为(比如访问不存在的内存区域),程序自然就崩溃了。

正确的修复写法

你需要操作的是parts["parts"]这个数组,而非parts本身。这里有两种简洁的实现方式:

方式1:手动维护索引

void Box_20::BuildCommitUploadPostData(const PartInfoColl& partColl) { 
    Json::Value parts; 
    // 初始化对象中的"parts"字段为数组
    parts["parts"] = Json::arrayValue; 
    int idx = 0; 
    for (const auto& p : partColl) { 
        Json::Value partInfo; 
        partInfo["part_id"] = p.partId; 
        partInfo["offset"] = p.offset; 
        partInfo["size"] = p.size; 
        // 往"parts"数组中添加元素
        parts["parts"][idx] = partInfo; 
        idx++; 
    } 
    /// do more stuff here 
}

方式2:用append自动添加(更简洁)

JsonCpp的数组类型支持append方法,自动把元素加到数组末尾,不用手动维护索引:

void Box_20::BuildCommitUploadPostData(const PartInfoColl& partColl) { 
    Json::Value parts; 
    parts["parts"] = Json::arrayValue; 
    for (const auto& p : partColl) { 
        Json::Value partInfo; 
        partInfo["part_id"] = p.partId; 
        partInfo["offset"] = p.offset; 
        partInfo["size"] = p.size; 
        // 直接append到数组末尾
        parts["parts"].append(partInfo); 
    } 
    /// do more stuff here 
}

额外小提示

  • 日常开发中,可以用isArray()、isObject()方法判断Json::Value的类型,避免类似的访问错误;
  • 如果需要给数组元素套一层"part"键(比如你最初写的parts[idx]["part"]),只需要把partInfo放到一个新的Json对象里再添加即可:
    Json::Value partWrapper;
    partWrapper["part"] = partInfo;
    parts["parts"].append(partWrapper);
    

内容的提问来源于stack exchange,提问作者PMcK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:00:30