2017-08-25 200 views
1

私はhttps://github.com/nlohmann/jsonと一緒に作業しています。しかし、私はすべてのノードがIDと配列(「子」要素)を持っている必要がありますnlohmann jsonを使用してC++で入れ子になったjsonオブジェクトを作成

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

outout以下のJSONを作成するための難しさを見つけることしています。どの子も再帰的に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; 

} 
+0

がどのように我々はそれを推測することになっている5 6は3の子で、2のような子ではありませんか?この投稿には、あなたの最後の質問(https://stackoverflow.com/questions/45882363/c-create-json-output-from-a-tree-like-input)の多くの同じ問題があります。 – AndyG

+0

id要素の値は本当に気にしません。私はちょうどnlohmann json – cateof

答えて

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; 
} 
+0

ありがとうを使用してデータの再帰的な表現を作成する方法を知りたい。 to_jsonメソッドを使用するにはOKと思われます。しかし、ノードを作成することは難しいです。この初期化は、OK {1、{{2、{}}、{3、{{5、{}}、{6、{}}}}、{4、{}}}}で動作します。ノードを追加する簡単な方法はありますか?つまり、親に子を追加することですか? – cateof

+1

@cateof 'json_node_t'はあなたのクラスなので、意図した使い方に適した便利なメソッドを追加できます。私はその答えにいくつかの例を加えました。 – Anton

関連する問題