2017-05-01 3 views
3

Ich versuche Boost property tree zu verwenden, um eine JSON-Datei zu analysieren. Hier ist die JSON-DateiJSON mit Boost lesen property_tree

{ 
    "a": 1, 
    "b": [{ 
     "b_a": 2, 
     "b_b": { 
      "b_b_a": "test" 
     }, 
     "b_c": 0, 
     "b_d": [{ 
      "b_d_a": 3, 
      "b_d_b": { 
       "b_d_c": 4 
      }, 
      "b_d_c": "test", 
      "b_d_d": { 
       "b_d_d": 5 
      } 
     }], 
     "b_e": null, 
     "b_f": [{ 
      "b_f_a": 6 
     }], 
     "b_g": 7 
    }], 
    "c": 8 
} 

und ein MWE

#include <iostream> 
#include <fstream> 

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 

namespace pt = boost::property_tree; 

using namespace std; 

int main() 
{ 

    boost::property_tree::ptree jsontree; 
    boost::property_tree::read_json("test.json", jsontree); 

    int v0 = jsontree.get<int>("a"); 
    int v1 = jsontree.get<int>("c"); 
} 

Frage ich zur Zeit wissen, wie die äußersten Variablen lesen a und c. Ich habe jedoch Schwierigkeiten beim Lesen anderer Ebenen wie b_a, b_b_a, b_d_a und so weiter. Wie kann ich das mit Boost machen? Ich suche nicht unbedingt nach einer Lösung mit Schleifen, sondern versuche nur herauszufinden, wie man innere Variablen "extrahiert".

Ich bin offen für die Verwendung anderer Bibliotheken, wenn sie optimal sind. Aber bis jetzt sieht Boost vielversprechend aus.

+0

Sie können "." Trennzeichen zum Festlegen des Pfades zu verschachtelten Knoten wie 'jsontree.get (" b.b_b.b_b_a ")' – zett42

+1

Für JSON würde ich generell eine von zwei Möglichkeiten empfehlen. Wenn Sie so etwas wie einen REST-Server tun, der so schnell wie möglich mit * massiven * JSON-Mengen arbeiten muss, möchten Sie [RapidJSON] (https://github.com/miloyip/rapidjson). Für fast alles andere wünschst du wahrscheinlich [Nlohmanns JSON-Bibliothek] (https://github.com/nlohmann/json). –

+0

@ zett42 Ich habe es ausprobiert, bekomme ich einen Fehler: 'Beenden aufgerufen nach dem Werfen einer Instanz von 'boost :: exception_detail :: clone_impl >' was(): Kein solcher Knoten (b.b_b.b_b_a) ' – BillyJean

Antwort

1

Um verschachtelte Elemente zu erhalten, können Sie die Pfadsyntax verwenden, bei der jede Pfadkomponente durchgetrennt wird. Die Dinge sind hier etwas komplizierter, weil der Kindknoten b ein Array ist. Sie können also nicht auf eine Schleife verzichten.

const pt::ptree& b = jsontree.get_child("b"); 
for(const auto& kv : b){ 
    cout << "b_b_a = " << kv.second.get<string>("b_b.b_b_a") << "\n";  
} 

Live demo at Coliru.

Außerdem habe ich Code den ganzen Baum rekursiv zu drucken, so können Sie sehen, wie wird die JSON zum ptree übersetzt. Array-Elemente werden als Schlüssel/Wert-Paare gespeichert, wobei der Schlüssel eine leere Zeichenfolge ist.

Verwandte Themen