JsonCpp - 修改对象数组

问题描述

我在 JsonCpp::Value 中有以下对象数组:

[{"foo": "bar","baz": ["Hello","World"]},{"Hello": "99bottles","baz": ["bar","foo"]},{"beer": "hello","world": ["foo"]}.... ]

我必须迭代它们并交替它们(删除一些元素,添加一个元素)。

我可以轻松地遍历 JsonArray:

for (Json::Value::ArrayIndex i = 0; i != array.size(); i++) {
  doc[i] = Json::Value();
  Json::Value result = array.get(i,Json::Value());
  std::cout<<"-------------------"<<std::endl;
  std::cout<<result.toStyledString()<<std::endl;
}

但是 array.get() 返回对象的副本。我将无法修改对象本身。我可以创建一个新数组,并根据原始数组的值用新对象填充它,但这会非常昂贵。

使用 JsonCpp“就位”是否有可能实现我的目标?并避免额外的内存开销?

解决方法

您使用的 get() 必须返回一个值而不是引用,因为您可以使用无效的 i 进行调用,它将返回您提供的默认值。 IE。对于大小为 2 的数组,您应该能够调用 array.get(17,Json::Value()) 并且您将返回一个默认初始化的 Json::Value

如果您确定该元素存在(这里就是这种情况),您可以使用 array[i],它会给您一个参考。请注意,您还需要将 result 的类型更改为 Json::Value &,否则您仍然会得到一个副本。

请注意,这一切都在 API documentation for JsonCpp 中显示和解释。我自己从来没有使用过这个库,上面的所有信息都是我从那个页面得到的。