2012-12-20 16 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 कोड में है।

पीएस: एलएलवीएम जीसीसी 4.2 कंपाइलर के साथ एक्सकोड 4.5.2 का उपयोग करना।

उत्तर

5

समस्या property_tree के साथ नहीं है, समस्या यह है कि आप वेक्टर में स्थानीय चर के लिए पॉइंटर स्टोर करने का प्रयास करते हैं। आप मूल्य से बचा सकते हैं, या कुछ स्मार्ट पॉइंटर का उपयोग कर सकते हैं (उदाहरण के लिए boost::shared_ptr)।

समस्या:

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

इस समारोह से बाहर निकलने के बाद, स्थानीय चर Item, नष्ट कर दिया जाएगा ताकि आप झूलने सूचक है।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, मैं सी ++ कोडिंग के लिए काफी नया हूं, तो क्या आप इसे हल करने में मेरी सहायता कर सकते हैं? –

+0

मेरे पास एक फिक्स है। मैंने बदल दिया: 'टाइपपीफ वेक्टर एकाधिक_t;' to 'typedef vector एकाधिक_t;', और तदनुसार शेष कोड बदल दिया। क्या इस विधि के लिए कोई नुकसान है? –

+0

@GlennVonk नहीं, आपके मामले में कोई नुकसान नहीं है। – ForEveR