2012-12-20 86 views
9

我正在構建一個從themoviedb.com獲取電影信息的應用程序。信息以JSON文件提供。我試圖使用boost屬性樹來存儲信息。但是有一個小問題。用boost屬性樹解析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。

回答

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