【问题标题】:How to add child/nested element inside json using json11 library?如何使用 json11 库在 json 中添加子/嵌套元素?
【发布时间】:2016-08-11 05:21:22
【问题描述】:

我想使用 json11 构建以下 json 对象

{
  "arrayOfData": [
    8,
    11,
    2016
  ],
  "objectOfData": [
    {"day": "8"},
    {"month": "11"},
    {"year": "2016"}]
}

我想在 json11 对象中添加数据数组,嵌套/子对象。

【问题讨论】:

    标签: c++ json object nested


    【解决方案1】:

    json11 支持嵌套对象和数组的以下语法:

    {
       { //notice one more { here
    
         "arrayOfData", Json::array {  //notice {
             8,
             11,
             2016
           }
       }, //close
    
       {  //open
          "objectOfData", Json::array {
               Json::object { {"day", "8"} },    //notice {{ and }}
               Json::object { {"month", "11"} },
               Json::object { {"year", "2016"} }
           }
       } //close
    }
    

    嵌入的 cmets 和嵌套结构的细节看起来很笨拙。让我们缩小并查看一般语法 - 更大的图景 - 没有 cmets 和嵌套结构的细节:

    auto object = Json::object {
       { key1, value1 },
       { key2, value2 },
       { key3, value3 },
       { key4, Json::array { ... } },
       { key5, Json::object { {...}, {...}, ... } },
       { key6, value6}
    };
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      首先我们将构建一个空的 json11 对象:

      json11::Json::object parent = json11::Json::object{};
      

      然后我们将构建我们想要放在父 json 上的子/嵌套数组:

      std::vector<int> array;
      array.push_back(8);
      array.push_back(11);
      array.push_back(2016);
      

      现在我们将上面的数组添加到 json11 对象中:

      parent["arrayOfData"] = array;
      

      现在我们将使用 json11 对象的向量构建对象:

      std::vector<json11::Json::object> object;
      object.resize(3);
      
      object[0] = json11::Json::object{};
      object[0]["day"] = "8";
      
      object[1] = json11::Json::object{};
      object[1]["month"] = "11";
      
      object[2] = json11::Json::object{};
      object[2]["year"] = "2016";
      

      将上述对象添加到 json11 对象中:

      parent["objectOfData"] = object;
      

      最后生成json格式的字符串:

      json11::Json json = json11::Json{ parent };
      
      std::string jsonString = json.dump();
      

      现在jsonString 应该如下所示:

      {"arrayOfData": [8, 11, 2016], "objectOfData": [{"day": "8"}, {"month": 
      "11"}, {"year": "2016"}]}
      

      【讨论】:

      • 太笨拙了,因为它太迫切了。即使是复杂的 json 对象,也必须有 one-line 初始化支持。这在 C++14 中是可能的。
      • 更糟糕的是它甚至都不对。您在此处将 objectOfData 设为数组(检查方括号)。您应该为它创建地图,而不是矢量。
      • @KristófSzalay 上面的代码正在运行。为什么你认为json11::Json::object 只取地图而不取向量?
      • 检查您创建的 json。 objectofdata 不是一个具有 3 个元素的对象,而是一个由 3 个单元素对象组成的数组。
      猜你喜欢
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多