2010-01-22 5 views
58

मैं बूस्ट प्रॉपर्टी पेड़ का उपयोग करके JSON सरणी बनाने की कोशिश कर रहा हूं।संपत्ति पेड़ का उपयोग कर बूस्ट में JSON सरणी बनाना

documentation कहता है: "JSON arrays को नोड्स में मैप किया जाता है। प्रत्येक तत्व खाली नाम वाला एक बच्चा नोड होता है।"

तो मैं खाली नामों के साथ एक संपत्ति पेड़ बनाना चाहता हूं, फिर सरणी निकालने के लिए write_json(...) पर कॉल करें। हालांकि, दस्तावेज़ीकरण मुझे नहीं बताता कि अनामित बच्चे नोड्स कैसे बनाएं। मैं ptree.add_child("", value) कोशिश की, लेकिन यह पैदावार:

Assertion `!p.empty() && "Empty path not allowed for put_child."' failed 

प्रलेखन किसी भी तरह से मैं यह पता लगाने कर सकते हैं में कम से कम नहीं, तो इस बात का पता करने के प्रतीत नहीं होता। क्या कोई मदद कर सकता है?

उत्तर

19

आपको मज़े का यह टुकड़ा क्या करना है। यह स्मृति से है, लेकिन ऐसा कुछ मेरे लिए काम करता है।

boost::property_tree::ptree root; 
boost::property_tree::ptree child1; 
boost::property_tree::ptree child2; 

// .. fill in children here with what you want 
// ... 

ptree.push_back(std::make_pair("", child1)); 
ptree.push_back(std::make_pair("", child2)); 

लेकिन वहाँ है json पार्स और लिखित रूप में कई कीड़े बाहर देखते हैं। जिनमें से कई मैं के लिए बग रिपोर्ट सबमिट करने के बाद - कोई जवाब नहीं :(

संपादित करें: इसका इस्तेमाल के रूप में गलत तरीके से serializing के बारे में शंकाओं का समाधान करने { ":" "" "": ""}

यह केवल तब होता । जब सरणी मूल तत्व है बढ़ावा ptree लेखक वस्तुओं के रूप में सभी जड़ तत्वों व्यवहार करता है -। कभी नहीं सरणियों या मूल्यों यह बढ़ावा/propert_tree/विस्तार से निम्न पंक्ति/json_parser_writer.hpp

else if (indent > 0 && pt.count(Str()) == pt.size()) 

छुटकारा पाने के कारण होता है "इंडेंट>&" इसे सरणी लिखने की अनुमति देगा।

आप पसंद नहीं है कितनी जगह आप पैच मैं here

+0

यह उचित नहीं है। एक सरणी प्राप्त करने के बजाय JSON पर डंप करने के बाद, मुझे यह मिलता है: {"": "", "": ""}। –

+0

यह पोस्ट करने के लिए पोस्ट को अपडेट किया गया है कि यह क्यों हो रहा है और इसे कैसे ठीक किया जाए। –

+0

रिपोर्ट करने में दुख की बात है कि ऐसा लगता है कि 1.53.0 में रूट तत्वों के रूप में सरणी बनाना अभी भी असंभव है। – conciliator

10

प्रदान की है जब संपत्ति ट्री उपयोग करने के लिए एक JSON संरचना मैं इसी तरह की समस्याओं का समाधान नहीं किया जो मैं का सामना करना पड़ा प्रतिनिधित्व करने के लिए शुरू करने का उपयोग कर सकते उत्पादन किया जाता है। यह भी ध्यान दें कि प्रलेखन से, संपत्ति का पेड़ पूरी तरह से प्रकार की जानकारी का समर्थन नहीं करता है:

JSON मान मान वाले नोड्स में मैप किए जाते हैं। हालांकि, सभी प्रकार की जानकारी खो जाती है; संख्याओं के साथ-साथ शाब्दिक "शून्य", "सत्य" और "झूठी" बस उनके स्ट्रिंग फॉर्म में मैप किए जाते हैं।

इसे सीखने के बाद, मैंने अधिक पूर्ण JSON कार्यान्वयन JSON Spirit पर स्विच किया। यह लाइब्रेरी जेएसओएन व्याकरण कार्यान्वयन के लिए बूस्ट स्पिरिट का उपयोग करती है और पूरी तरह से जेएसओएन सहित सरणी का समर्थन करती है।

मेरा सुझाव है कि आप वैकल्पिक सी ++ JSON कार्यान्वयन का उपयोग करें।

using boost::property_tree::ptree; 

ptree targetTree; 
ptree arrayChild; 
ptree arrayElement; 

//add array elements as desired, loop, whatever, for example 
for(int i = 0; i < 3; i++) 
{ 
    arrayElement.put_value(i); 
    arrayChild.push_back(std::make_pair("",arrayElement)) 
} 

जब बच्चा कर दिया गया है:

+0

मैंने इस उत्तर को लिखने के बाद से कई नए पुस्तकालयों को लिखा है। यहां एक अच्छा है कि मैं हाल ही में आया था: https://github.com/nlohmann/json – Yukiko

6

मेरे मामले में मैं माइकल के जवाब की तरह, एक बच्चे पेड़ बना सकते हैं और सरणी तत्वों के साथ पॉप्युलेट एक कम या ज्यादा मनमाना स्थान पर एक सरणी जोड़ना चाहते थे, इसलिए, आबादी वाले, put_child() या add_child() फ़ंक्शन का उपयोग पूरे बच्चे के पेड़ को लक्षित पेड़ में जोड़ने के लिए करें, इस तरह ...

targetTree.put_child(ptree::path_type("target.path.to.array"),arrayChild) 

put_child समारोह और एक बहस के लिए एक रास्ता और एक पेड़ लेता targetTree में "भ्रष्टाचार" arrayChild होगा

84

सरल सरणी:

{ 
    "MyArray": 
    [ 
     "1", 
     "2", 
     "3" 
    ] 
} 
: में

#include <boost/property_tree/ptree.hpp> 
using boost::property_tree::ptree; 

ptree pt; 
ptree children; 
ptree child1, child2, child3; 

child1.put("", 1); 
child2.put("", 2); 
child3.put("", 3); 

children.push_back(std::make_pair("", child1)); 
children.push_back(std::make_pair("", child2)); 
children.push_back(std::make_pair("", child3)); 

pt.add_child("MyArray", children); 

write_json("test1.json", pt); 

परिणाम

ऑब्जेक्ट्स पर ऐरे:

ptree pt; 
ptree children; 
ptree child1, child2, child3; 


child1.put("childkeyA", 1); 
child1.put("childkeyB", 2); 

child2.put("childkeyA", 3); 
child2.put("childkeyB", 4); 

child3.put("childkeyA", 5); 
child3.put("childkeyB", 6); 

children.push_back(std::make_pair("", child1)); 
children.push_back(std::make_pair("", child2)); 
children.push_back(std::make_pair("", child3)); 

pt.put("testkey", "testvalue"); 
pt.add_child("MyArray", children); 

write_json("test2.json", pt); 

परिणामों में:

{ 
    "testkey": "testvalue", 
    "MyArray": 
    [ 
     { 
      "childkeyA": "1", 
      "childkeyB": "2" 
     }, 
     { 
      "childkeyA": "3", 
      "childkeyB": "4" 
     }, 
     { 
      "childkeyA": "5", 
      "childkeyB": "6" 
     } 
    ] 
} 

आशा है कि यह मदद करता है

+3

कृपया ध्यान दें कि संख्याएं स्ट्रिंग के रूप में एन्कोड की गई हैं और संख्याएं नहीं हैं। – Luke

+0

हाय @ ल्यूक, मुझे तारों के साथ यह समस्या है। मैं उन्हें संख्याओं के रूप में कैसे एन्कोड कर सकता हूं? – Alejandro

+3

बूस्ट लाइब्रेरी का उपयोग करते समय मुझे कोई अच्छा समाधान नहीं मिला। मैं इसके बजाय rapidjson के लिए स्विच किया। – Luke