Sreeraj Chundayil
Sreeraj Chundayil

Reputation: 5859

nlohmann json insert value array partially to already existing data

I have a particular case which I am trying to solve with minimal changes if possible. one of the data is

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

[ 1,2,3,[[4,5]] ]

Later at some stage I want to insert

{1,2,3,{4,6}}

Then it should become

[ 1,2,3,[[4,5],[4,6]] ]

How can I make this possible without making 1,2,3 value as key?

Upvotes: 1

Views: 4415

Answers (1)

Joseph Larson
Joseph Larson

Reputation: 9058

I did some playing. I didn't get the results you were looking for. Here's my code and results so far.

#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;
}

Output:

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

You'll see that the first push_back pushed an array inside an array, which is probably one level deeper than you wanted, and the second one added a second array, which is also not what you want.

Which means you're probably going to have to write your own method, especially as you want to also handle uniqueness. I personally never free-format data that way you have in your example. But maybe your method would look something like:

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);
         }
    }
}

I modified my code like this:

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

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

And got this:

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

I'm not going to write the isUnique method. But I think you may have to take this to conclusion.

Upvotes: 3

Related Questions