2012-12-20 9 views
9

Ich baue eine Anwendung, die Filminformationen von themoviedb.com bekommt. Die Informationen werden in einer JSON-Datei bereitgestellt. Ich versuche, die Informationen mithilfe des Boost-Eigenschaftsbaums zu speichern. Aber es gibt ein kleines Problem.Parsen von JSON mit Boost-Eigenschaftenbaum

ich illustrieren das Problem durch den folgenden Code:

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

using namespace std; 
using boost::property_tree::ptree; 

class single_t{ 
    int    sID; 
    string   sName; 
public: 
    void   setID(int ID){sID=ID;} 
    int    getID(){return sID;} 
    void   setName(string Name){sName=Name;} 
    string   getName(){return sName;} 
}; 

typedef vector<single_t*> multiple_t; 

class foo{ 
    string   fTitle; 
    multiple_t  fItems; 
public: 
    string   getTitle(){return fTitle;} 
    void   setTitle(string Title){fTitle=Title;} 
    multiple_t  getItems(){return fItems;} 
    void   setItems(multiple_t Items){fItems = Items;} 
    void   setItems(single_t Item){fItems.push_back(&Item);} 
}; 

int main() { 
    try{ 
     string response = "{\"title\":\"Foo\",\"items\":[{\"id\":123,\"name\":\"test1\"},{\"id\":456,\"name\":\"test2\"}]}"; 

     ptree pt; 
     stringstream ss; ss << response; 
     read_json(ss, pt); 
     foo results; 
     results.setTitle(pt.get<string>("title")); 
     BOOST_FOREACH(ptree::value_type &v,pt.get_child("items")){ 
      single_t result; 
      result.setID(v.second.get<int>("id")); 
      result.setName(v.second.get<string>("name")); 
      results.setItems(result); 
     } 
     cout << "Tilte: " << results.getTitle() << endl; 
     cout << "Items:" << endl; 
     for (int i=0; i!=results.getItems().size(); i++) { 
      cout << "\tID: " << results.getItems()[i]->getID()<< endl; 
      cout << "\tName: " << results.getItems()[i]->getName()<< endl; 
     } 
    } 
    catch (exception& e) 
    { 
     cout << "Exception: " << e.what(); 
    } 

} 

Aber wenn ich diese laufen bekomme ich folgende Ausgabe:

Tilte: Foo 
Items: 
    ID: 456 
    Name: test2 
    ID: 456 
    Name: test2 

Weiß jemand, was ich falsch mache? Ich denke, es ist in dem BOOST_FOREACH-Code.

PS: Verwenden von Xcode 4.5.2 mit LLVM GCC 4.2 Compiler.

Antwort

5

Problem ist nicht mit property_tree, Problem ist, dass Sie Speicher Zeiger auf lokale Variable in Vektor versuchen. Sie können nach Wert speichern oder einen intelligenten Zeiger verwenden (z. B. boost::shared_ptr).

Problem:

void   setItems(single_t Item){fItems.push_back(&Item);} 

Nach dem Austritt aus dieser Funktion Item lokale Variable zerstört wird, so dass Sie baumelnden Zeiger haben.

+0

Vielen Dank für die schnelle Antwort, Ich bin ziemlich neu in C++ - Codierung, also könnten Sie mir helfen, dies zu lösen? –

+0

Ich habe eine Lösung. Ich änderte: 'typedef Vektor multiple_t;' zu 'typedef Vektor multiple_t;', und änderte den Rest des Codes entsprechend. Gibt es Nachteile für diese Methode? –

+0

@GlennVonk Nein, in Ihrem Fall gibt es keine Nachteile. – ForEveR