我已经有json11个对象构建:
Json my_json = Json::object {
{ "key1", "value1" },
{ "key2", false },
{ "key3", Json::array { 1, 2, 3 } },
};
我想为key3数组添加一个新值,如下所示:
my_json["keys3"].push_back(4);
我怎么能做到这一点?我无法看到任何修改对象的内容(所有访问值的操作符都是常量!)
答案 0 :(得分:2)
不幸的是,您似乎无法直接修改Json
的实例
它是JsonValue
周围无法访问的不透明包装。
无论如何,请注意Json::object
是std::map<std::string, Json>
。您可以创建原始Json::object
的副本,如下所示:
Json::object json_obj = my_json.object_items();
然后,密钥keys3
包含Json::array
,只不过是std::vector<Json>
。
您可以按照以下方式对其进行修改:
json_obj["keys3"].push_back(4);
最后,您必须从Json
创建一个新的Json::object
以及所有内容:
Json another_json = json_obj;
操作相当昂贵。
我怀疑正确的方法是逐步创建对象,并在流程的最后创建一个Json
的实例。
答案 1 :(得分:0)
我在github上发现了关于这个问题的下一个问题:
Json类型是不可变的,但Json :: object类型只是一个 std :: map,所以如果第一行创建了一个代码,你的代码就可以了 相反,Json :: object。您可以使用该地图构建您的任何数据 想要,然后在你修改它时将它包装成Json(数据)。您 也可以使用object_items()从Json中提取地图,复制它, 改变它,并用它来创建一个新的Json,类似于一个构建器 图案。
Json类型是一个不可变的值类型,它有一个 多种优势,包括线程安全性和共享能力 跨副本的数据。如果你想要一个可变阵列,你可以使用 Json :: array(它只是一个vector的typedef)并将其变异 在将它放入Json对象之前自由地进行。
答案 2 :(得分:0)
如果您使用的是json11,则可以这样操作:
Json json = Json::object
{
{
"num_neurons_in_each_layer", Json::array{ 1000, 1000, 10, 10 }
},
{
"non_editable_data",
Json::object
{
{"train_error", -1.0 },
{"validation_error", -1.0 }
}
}
};
Json* p_error = const_cast<Json*>(&json["non_editable_data"].
object_items().find("validation_error")->second);
*p_error = Json(2.0); //"validation_error" has been modified to 2.0
p_error = nullptr;
delete p_error;