2015-07-10 92 views
3

我有這樣的代碼解析的std :: string與升壓ptree中

std::string ss = "{ \"item1\" : 123, \"item3\" : 456, \"item3\" : 789 }"; 

// Read json. 
ptree pt2; 
std::istringstream is(ss); 
read_json(is, pt2); 
std::string item1= pt2.get<std::string>("item1"); 
std::string item2= pt2.get<std::string>("item2"); 
std::string item3= pt2.get<std::string>("item3"); 

,我需要一個JSON字符串解析爲std::string的如上圖所示,我試圖把這裏的catch語句,但實際的錯誤只是<unspecified file>(1):

所以我假設read_json只是讀取文件,而不是std :: string,以什麼方式可以解析std::string

+0

*你會得到報告的錯誤嗎?您可以創建一個[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),並向我們展示實際和預期的輸出結果? –

+0

順便說一下,我自己創建了一個MCVE,[它工作正常](http://ideone.com/vuedE1)。也許你在別的地方還有其他問題? –

回答

0

您的示例從讀取(即「如同文件」,如果您願意的話)。該流已填充與您的字符串填充。所以你解析你的字符串。你不能直接從字符串中解析。

你可以使用,無論升壓IOSTREAMS從源字符串的情況下直接拷貝讀取:

Live On Coliru

#include <iostream> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 

#include <boost/iostreams/device/array.hpp> 
#include <boost/iostreams/stream.hpp> 

namespace pt = boost::property_tree; 

std::string ss = "{ \"item1\" : 123, \"item2\" : 456, \"item3\" : 789 }"; 

int main() 
{ 
    // Read json. 
    pt::ptree pt2; 
    boost::iostreams::array_source as(&ss[0], ss.size()); 
    boost::iostreams::stream<boost::iostreams::array_source> is(as); 

    pt::read_json(is, pt2); 
    std::cout << "item1 = \"" << pt2.get<std::string>("item1") << "\"\n"; 
    std::cout << "item2 = \"" << pt2.get<std::string>("item2") << "\"\n"; 
    std::cout << "item3 = \"" << pt2.get<std::string>("item3") << "\"\n"; 
} 

這將剛纔複製少。它不會導致不同的錯誤報告。

考慮在字符串中包含換行符,以便解析器將報告行號。