2017-08-31 107 views
-1

使用https://github.com/nlohmann/json,我試圖將值分配給一個遞歸數據結構(json_node_t):故障在C嵌套數據結構++

#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

注意,[你不能真正做到這一點(https://stackoverflow.com/questions/18672135/why-c-containers-dont-allow-incomplete在當前的C++中。 – juanchopanza

+0

您是否介意將您的問題標題改爲對未來有關該特定問題的研究有意義和有用的內容? – user0042

回答

0

你輸出node_0;,但你永遠不會追加任何孩子。原因是,parents[0] = node_0;副本node_0。所以當你parents[0].children.push_back(node_i);你作爲孩子附加node_inode_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; 
} 

輸出:

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

那麼,最後需要做些什麼呢? – cateof

+0

@cateof,問題是「什麼是錯的?」 :)明顯的解決辦法是將指針存儲到節點並動態分配節點。這樣,如果'std :: vector 父母;'然後'父母[i - 1] - > children.push_back(node_i);'會引用原始節點。 – WindyFields

+0

當然,'node_0'和'node_i'也必須是指針...我希望你有想法 – WindyFields