使用 Boost ptree 解析 std::string
Posted
技术标签:
【中文标题】使用 Boost ptree 解析 std::string【英文标题】:Parse std::string with Boost ptree 【发布时间】:2015-07-10 10:09:18 【问题描述】:我有这个代码
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
可以通过什么方式解析?
【问题讨论】:
在哪里收到报告的错误?您能否创建一个Minimal, Complete, and Verifiable Example 并向我们展示,以及实际和预期的输出? 顺便说一句,我自己创建了一个 MCVE,and it works fine。也许您在其他地方还有其他问题? 【参考方案1】:您的示例从 流 中读取(如果您愿意,那就是“像文件一样”)。流已填充您的字符串。所以你正在解析你的字符串。您不能直接从字符串中解析。
但是,您可以使用 Boost 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";
这只会减少复制。它不会导致不同的错误报告。
考虑在字符串中包含换行符,以便解析器报告行号。
【讨论】:
以上是关于使用 Boost ptree 解析 std::string的主要内容,如果未能解决你的问题,请参考以下文章
c++ boost xml解析器ptree.get函数——不接受节点名中的空格
如何使 boost ptree 以相同的方式解析 xml 和 json?