nlohmann动态创建多级对象

时间:2018-09-02 14:19:43

标签: c++ json nlohmann-json

我需要创建以下结构,但是我正努力使用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 :(得分:0)

以下代码可构造所需的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);
}