2015-07-10 94 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"; 
} 

这将刚才复制少。它不会导致不同的错误报告。

考虑在字符串中包含换行符,以便解析器将报告行号。