使用 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 语句,但实际错误只是 &lt;unspecified file&gt;(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函数——不接受节点名中的空格

如何手动创建具有 XML 属性的 boost ptree?

如何使 boost ptree 以相同的方式解析 xml 和 json?

boost ptree 即时修改一组值

我们如何在另一个 boost ptree 中插入一个 boost ptree 作为节点?

boost::ptree 和 KeyCompare 函数?