C ++中嵌套数据结构的问题

时间:2017-08-31 19:14:56

标签: c++ json

使用https://github.com/nlohmann/json,我试图将值赋给递归数据结构(json_node_t):

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

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

int main() {
    json_node_t node_0;
    std::vector<int> values = {1,2,3};

    std::vector<json_node_t> parents;
    parents.resize(20);

    for(int i = 0; i < values.size(); i++) {

        if ( i == 0 )
        {
            node_0.id = values[0];
            std::vector<json_node_t> node_children_;
            node_0.children = node_children_;
            parents[0] = node_0;

        } else {

            json_node_t node_i;
            node_i.id = values[i];

            std::vector<json_node_t> node_i_children_;
            parents[i] = node_i;

            parents[i-1].children.push_back(node_i);
        }
    }

    json j = node_0;

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

我的目的是创建一个类似于以下内容的JSON表示:

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

    }
  ]
}

但是,嵌套的子项不会被打印。我只得到这个输出:

{
  "ID": 1
}

有什么问题?我无法将孩子与父母联系正确。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您输出<h3 style='margin-bottom: 0;'><u>MANAGEMENT SUMMARY</u></h3> ,但您永远不会附加任何子项。原因是node_0;parents[0] = node_0;。因此,当您node_0parents[0].children.push_back(node_i);作为孩子附加到node_i的副本时 - 原始版本保持不变。这就是为什么它最终不包含任何孩子。

修改 我的代码。

node_0

输出:

#include "json.hpp"

#include <memory>
#include <vector>
#include <iostream>

struct json_node;
using json_node_ptr = std::shared_ptr<json_node>;

struct json_node
{
    int id;
    std::vector<json_node_ptr> children;

    json_node(int _id)
        : id{ _id }
    {
    }
};

void to_json(nlohmann::json& j, const json_node_ptr& node)
{
    j = {{"ID", node->id}};
    if (!node->children.empty()) {
        j.push_back({"children", node->children});
    }
}

int main()
{
    std::vector<int> values = {1,2,3};
    std::vector<json_node_ptr> parents;

    for(int i = 0; i < values.size(); i++)
    {
        if ( i == 0 ) {
            auto root = std::make_shared<json_node>(values[0]);
            parents.push_back(root);
        } else {
            parents.push_back(std::make_shared<json_node>(values[i]));
            parents[i-1]->children.push_back(parents[i]);
        }
    }

    nlohmann::json j = parents[0];
    std::cout << j.dump(2) << std::endl;

    return 0;
}