Разбор JSON с бустом свойства дерева

Я создаю приложение, которое получает информацию о фильме с themoviedb.com. Информация представлена ​​в файле JSON. Я пытаюсь сохранить информацию, используя дерево свойств boost. Но есть небольшая проблема.

Я иллюстрирую проблему следующим кодом:

#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();
}

}

Но когда я запускаю это, я получаю следующий вывод:

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

Кто-нибудь знает, что я делаю не так? Я думаю, это в коде BOOST_FOREACH.

PS: Использование Xcode 4.5.2 с компилятором LLVM GCC 4.2.

9

Решение

Проблема не с property_treeПроблема в том, что вы пытаетесь сохранить указатель на локальную переменную в векторе. Вы можете сохранить по значению или использовать какой-нибудь умный указатель (например, boost::shared_ptr).

Проблема:

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

После выхода из этой функции локальная переменная Item будет уничтожен, так что у вас есть свисающий указатель.

5

Другие решения

Других решений пока нет …