如何使用JSON11库修改JSON对象

How to modify a json object using json11 library?

本文关键字:JSON 对象 修改 何使用 JSON11      更新时间:2023-10-16

我已经有一个已经json11对象构建:

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

我想为这样的键3阵列添加一个新值:

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

我如何实现?我看不到任何修改对象的东西(所有要访问值的操作员都是const!)

不幸的是,似乎您无法直接修改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::object创建一个新的Json,仅此而已:

Json another_json = json_obj;

非常昂贵的操作。
我怀疑正确的方法是逐步创建对象,并且在过程的末尾创建一个Json的实例。

我在github上找到了有关此问题的下一个问题:

  • [https://github.com/dropbox/json11/issues/20]:SkyPjack dimply

JSON类型是不变的,但是JSON ::对象类型只是一个 std :: map,因此,如果第一行创建了一个 json ::对象。您可以使用该地图来构建您的任何数据 需要,然后将其作为JSON(DATA)包装,然后将其修改为JSON(数据)。你 还可以使用Object_items()从JSON提取地图,复制它, 将其变异,并使用它来创建一个新的JSON,类似于建造者 模式。

  • [https://github.com/dropbox/json11/issues/75]:这很有趣,因为说明为什么无法修改JSON

JSON类型旨在是不变的值类型,其具有 优势的数量,包括线程安全和共享能力 跨副本的数据。如果您想要一个可变的阵列,则可以使用 json :: array(这只是矢量的打字)并将其变异 将其放入JSON对象之前自由。

如果您正在使用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;