nlohmann динамически создает многоуровневые объекты - PullRequest
0 голосов
/ 02 сентября 2018

Мне нужно создать следующую структуру, но я пытаюсь сделать это, используя json.

{
    "ParentTree": [{
        "Name": "Name3",
        "children": [{
            "Name": "Name2",
            "children": [{
                "Name": "Name1",
                "children": [{
                    "Name": "Name0"
                }]
            }]
        }]
    }]
}

Я пробовал ниже, но не смог понять, как динамически добавлять имена и дочерние ключи.

json jsonObj;
jsonObj["ParentTree"] = json::array();
for (auto index = 3; index >= 0; index--) {
    jsonObj["ParentTree"].push_back(json::object());
}

Ранее это делалось с использованием нижеприведенного способа без использования nlohmann json:

std::string PResult = "\"ParentTree\":[{";
for (int j = 3; j >= 0; j--)
{
    std::string num = std::to_string(j);
    PResult += "\"Name\":\"";
    PResult += "Name";
    PResult +=  num + "\",";
    if (j == 0) break;
    PResult += "\"children\":[{";
}

PResult.erase(PResult.length() - 1);

for (int j = 3; j >= 0; j--)
{
    PResult += "}]";
}

1 Ответ

0 голосов
/ 02 сентября 2018

Следующий код создает желаемый объект json.

На первый взгляд фигурные скобки могут сбивать с толку, но как только вы прочитаете документы и поймете, как json :: array () & json :: object () работает, вы должны быть в состоянии понять. (Прочитайте пример кода в гиперссылке выше.)

#include "json.h"
#include <iostream>
using namespace nlohmann;

int main() {
  json jsonObj;
  jsonObj["ParentTree"] = json::array();

  // Bottom-up approach: construct inside object first.
  json child0 = json::array({json::object({{"Name", "Name0"}})});
  json child1 = json::array( {json::object({{"Name", "Name1"}, {"children", child0}})} );
  json child2 = json::array( {json::object({{"Name", "Name2"}, {"children", child1}})} );
  jsonObj["ParentTree"] = json::array( {json::object({{"Name", "Name3"}, {"children", child2}})} );

  std::cout << jsonObj.dump(2);
}
...