nlohmann json 将值数组部分插入到现有数据中

问题描述

我有一个特殊情况,如果可能的话,我试图以最小的更改来解决。 其中一个数据是

js["key1"]["subkey2"]["subsubkey3"].push_back({1,2,3,{4,5}});

[ 1,[[4,5]] ]

稍后我想插入

{1,6}}

那么它应该变成

[ 1,5],[4,6]] ]

如何在不将 1,3 值作为键的情况下实现这一点?

解决方法

我玩了一些。我没有得到你想要的结果。到目前为止,这是我的代码和结果。

#include <iostream>
#include <json.hpp>

using namespace std;
using JSON = nlohmann::json;

int main() {
    JSON json = JSON::object();
    JSON key1JSON = JSON::object();
    JSON key2JSON = JSON::object();
    JSON key3JSON = JSON::array();

    key3JSON.push_back( {1,2,3,{4,5} } );
    key3JSON.push_back( {6} );

    key2JSON["subsubkey3"] = key3JSON;
    key1JSON["subkey2"] = key2JSON;
    json["key1"] = key1JSON;

    cout << json.dump(2) << endl;
}

输出:

{
  "key1": {
    "subkey2": {
      "subsubkey3": [
        [
          1,[
            4,5
          ]
        ],[
          6
        ]
      ]
    }
  }
}

您会看到第一个 push_back 将一个数组推送到数组中,这可能比您想要的更深一层,而第二个添加了第二个数组,这也不是您想要的。

这意味着您可能必须编写自己的方法,尤其是当您还想处理唯一性时。我个人从来没有像您在示例中那样使用自由格式的数据。但也许你的方法看起来像:

bool contains(const JSON &json,const JSON &value) {
    ... this looks like fun to write.
}

void appendUnique(JSON &json,const JSON &array) {
    for (JSON & thisJson: array) {
         if (!contains(json,thisJson)) {
             json.push_back(thisJson);
         }
    }
}

我像这样修改了我的代码:

void appendUnique(JSON &json,const JSON & array) {
    for (const JSON & thisJSON: array) {
        json.push_back(thisJSON);
    }
}
...

appendUnique(key3JSON,{1,5} } );
appendUnique(key3JSON,{6} );

得到这个:

{
  "key1": {
    "subkey2": {
      "subsubkey3": [
        1,[
          4,5
        ],6
      ]
    }
  }
}

我不会编写 isUnique 方法。但我认为你可能不得不就此得出结论。