2012-12-20 24 views
9

Tôi đang tạo ứng dụng nhận thông tin phim từ themoviedb.com. Thông tin được cung cấp trong tệp JSON. Tôi đang cố lưu trữ thông tin bằng cách sử dụng cây thuộc tính tăng cường. Nhưng có một vấn đề nhỏ.Phân tích cú pháp JSON bằng cây thuộc tính tăng cường

tôi minh họa cho vấn đề bằng đoạn mã sau:

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

} 

Nhưng khi tôi chạy này tôi nhận được kết quả như sau:

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

Có ai biết những gì tôi đang làm sai? Tôi đoán nó nằm trong mã BOOST_FOREACH.

PS: Sử dụng Xcode 4.5.2 với LLVM GCC 4.2 Trình biên dịch.

Trả lời

5

Vấn đề không phải với property_tree, vấn đề là, bạn thử lưu con trỏ vào biến cục bộ trong vectơ. Bạn có thể lưu theo giá trị hoặc sử dụng một số con trỏ thông minh (ví dụ: boost::shared_ptr).

Vấn đề:

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

Sau khi thoát khỏi chức năng này, biến cục bộ Item sẽ bị phá hủy, vì vậy bạn có con trỏ tòn ten.

+0

Cảm ơn bạn đã phản hồi nhanh, Tôi khá mới với mã hóa C++, vì vậy bạn có thể giúp tôi giải quyết vấn đề này không? –

+0

Tôi có bản sửa lỗi. Tôi đã thay đổi: 'typedef vector multiple_t;' to 'typedef vector multiple_t;', và thay đổi phần còn lại của mã cho phù hợp. Có bất kỳ bất lợi cho phương pháp này? –

+0

@GlennVonk Không, trong trường hợp của bạn không có bất lợi. – ForEveR

Các vấn đề liên quan