使用nlohmann json在c ++中创建嵌套的json对象

时间:2017-08-25 14:37:58

标签: c++ json c++11 nlohmann-json

我正在使用https://github.com/nlohmann/json并且效果很好。但是我发现创建以下json outout存在困难

 {
    "Id": 1,
    "Child": [
        {
            "Id": 2
        },
        {
            "Id": 3,
            "Child": [
                {
                  "Id" : 5
                },
                {
                  "Id" : 6
                }
            ]
        },
        {
            "Id": 4
        }
    ]
}

每个节点必须有一个id和一个数组(" Child"元素)。任何孩子都可以递归继续拥有Id或Child。上面的json只是一个例子。我想要的是使用nlohmann json在父节点和子节点之间创建一个链。

数字1,2,3 ......随机拾取。我们现在不关心这些价值观。

知道如何创建吗?

到目前为止

代码

#include <iostream>
#include <string>
#include <vector>
#include "json.hpp"

using json = nlohmann::json;


struct json_node_t {

    int id;
    std::vector<json_node_t> child;
};


int main( int argc, char** argv) {

    json j;

    for( int i = 0; i < 3; i++) {

        json_node_t n;

        n.id = i;
        j["id"] = i;

        if ( i < 2 ) {

            j["child"].push_back(n);


        }


    }


    return 0;

}

1 个答案:

答案 0 :(得分:1)

为了序列化您自己的类型,您需要为该类型实现to_json函数。

#include <iostream>
#include <string>
#include <vector>
#include "json.hpp"

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

struct json_node_t {
    int id;
    std::vector<json_node_t> child;
};

void to_json(json& j, const json_node_t& node) {
    j = {{"ID", node.id}};
    if (!node.child.empty())
        j.push_back({"children", node.child});
}

int main() {
    json_node_t node = {1, {{2, {}}, {3, {{5, {}}, {6, {}}}}, {4, {}}}};
    json j = node;

    cout << j.dump(2) << endl;
    return 0;
}

输出:

{
  "ID": 1,
  "children": [
    {
      "ID": 2
    },
    {
      "ID": 3,
      "children": [
        {
          "ID": 5
        },
        {
          "ID": 6
        }
      ]
    },
    {
      "ID": 4
    }
  ]
}

有几种方法可以初始化json_node_t(所有方法都生成相同的树和相同的输出):

struct json_node_t {
    int id;
    std::vector<json_node_t> child;
    json_node_t(int node_id, initializer_list<json_node_t> node_children = initializer_list<json_node_t>());
    json_node_t& add(const json_node_t& node);
    json_node_t& add(const initializer_list<json_node_t>& nodes);
};

json_node_t::json_node_t(int node_id, initializer_list<json_node_t> node_children) : id(node_id), child(node_children) {
}

json_node_t& json_node_t::add(const json_node_t& node) {
    child.push_back(node);
    return child.back();
}

json_node_t& json_node_t::add(const initializer_list<json_node_t>& nodes) {
    child.insert(child.end(), nodes);
    return child.back();
}

int main() {
    json_node_t node_a = {1, {{2, {}}, {3, {{5, {}}, {6, {}}}}, {4, {}}}};

    json_node_t node_b = {1, {2, {3, {5, 6}}, 4}};

    json_node_t node_c(1);
    node_c.add(2);
    node_c.add(3).add({5, 6});
    node_c.add(4);

    cout << json(node_a).dump(2) << endl << endl;
    cout << json(node_b).dump(2) << endl << endl;
    cout << json(node_c).dump(2) << endl;
    return 0;
}