2012-12-20 18 views
9

themoviedb.comからムービー情報を取得するアプリケーションを構築しています。情報はJSONファイルで提供されます。私は情報を格納するためにプロパティツリーを使用しています。しかし、少し問題があります。ブーストプロパティツリーを使用したJSONの解析

私は次のコードで、問題を示しています

#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:LLVM GCC 4.2でXcode 4.5.2を使用する4.2コンパイラ。

答えて

5

問題はproperty_treeではありません。問題は、ベクターにローカル変数へのポインタを格納しようとすることです。値で保存することも、スマートポインタを使用することもできます(例:boost::shared_ptr)。

問題:あなたはダングリングポインタを持っているので、

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

は、この機能を終了した後、ローカル変数Itemは、破壊されます。

+0

クイックレスポンスありがとうございました 私はC++コーディングにはかなり新しいので、これを解決する手助けができますか? –

+0

私には修正があります。私は変更しました: 'typedef vector multiple_t;'を 'typedef vector multiple_t;'に変更し、それに応じてコードの残りの部分を変更しました。この方法には何らかの欠点がありますか? –

+0

@GlennVonkいいえ、あなたの場合には欠点はありません。 – ForEveR

関連する問題