L'analyse JSON avec boost propriété de l'arbre
Je suis en train de construire une application qui reçoit les informations d'un film de themoviedb.com. Les informations sont fournies dans un fichier JSON. Je suis en train de stocker les informations d'utilisation de boost de la propriété de l'arbre. Mais Il y a un petit problème.
Je illustrer le problème par le code suivant:
#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();
}
}
Mais lorsque je l'exécute j'obtiens le résultat suivant:
Tilte: Foo
Items:
ID: 456
Name: test2
ID: 456
Name: test2
Personne ne sait ce que je fais mal? Je suppose que c'est dans le BOOST_FOREACH code.
PS: à l'Aide de Xcode 4.5.2 avec LLVM Compilateur GCC 4.2.
OriginalL'auteur Glenn Vonk | 2012-12-20
Vous devez vous connecter pour publier un commentaire.
Problème n'est pas avec
property_tree
, le problème, c'est que vous essayez de stocker pointeur vers une variable locale dans le vecteur. Vous pouvez enregistrer la valeur, ou d'utiliser certains pointeur intelligent (par exempleboost::shared_ptr
).Problème:
Après la sortie de cette fonction, la variable locale
Item
sera détruit, de sorte que vous avez balançant pointeur.J'ai un fix. J'ai changé:
typedef vector<single_t*> multiple_t;
àtypedef vector<single_t> multiple_t;
, et changé le reste du code en conséquence. Quels sont les inconvénients de cette méthode?Non, dans votre cas il n'y a pas d'inconvénients.
OriginalL'auteur ForEveR