如何创建并填充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
相关产品推荐
相关产品推荐

