使用Boost ptree解析std::string

5
我有这段代码。
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可以以什么方式被解析呢?

你在哪里看到了报错信息?能否请您创建一个最小化、完整化和可验证化的示例,并将实际输出和期望输出一起展示给我们呢? - Some programmer dude
顺便说一下,我自己创建了一个MCVE,它运行良好。也许你在其他地方有其他问题? - Some programmer dude
1个回答

4
您的示例从一个流中读取(类似于文件)。该流已经填充了您的字符串。因此,您正在解析字符串。您不能直接从字符串解析。但是,您可以使用Boost Iostreams直接从源字符串中读取而不需要复制: 在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";
}

那只会复制更少的内容,但不会改变错误报告。

考虑在字符串中包括换行符,这样解析器就能报告出错的行号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接