如何使用json11库修改json对象?

时间:2016-12-20 15:03:46

标签: c++ json object

我已经有json11个对象构建:

Json my_json = Json::object {
        { "key1", "value1" },
        { "key2", false },
        { "key3", Json::array { 1, 2, 3 } },
    };

我想为key3数组添加一个新值,如下所示:

my_json["keys3"].push_back(4);

我怎么能做到这一点?我无法看到任何修改对象的内容(所有访问值的操作符都是常量!)

3 个答案:

答案 0 :(得分:2)

不幸的是,您似乎无法直接修改Json的实例 它是JsonValue周围无法访问的不透明包装。

无论如何,请注意Json::objectstd::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;
相关问题