如何使用 json 解析器的 boost property_tree 创建空数组节点

Posted

技术标签:

【中文标题】如何使用 json 解析器的 boost property_tree 创建空数组节点【英文标题】:How can I create empty array node using boost property_tree of json parser 【发布时间】:2015-06-05 09:40:25 【问题描述】:

我正在尝试在json中创建一个数组节点,其输出是这样的:


    node: ["12", "13"]

但是当数组为空时,它会输出这个:


    node: ""

这不是我想要的,我需要这个:


    node: []

我该怎么做? 而且我不需要数字周围的双引号(“”)。 有人可以帮忙吗?

我的代码如下:

boost::property_tree::ptree pt;
boost::property_tree::ptree array;
for (vector<int>::const_iterator iter = v.begin();
    iter != v.end();
    ++iter)

    boost::property_tree::ptree node;
    node.put("code", *iter);
    array.push_back(std::make_pair("", node));

pt.add_child("array", array);

感谢您的关注。

【问题讨论】:

【参考方案1】:

PSA Boost 1.75.0 引入了 Boost JSON;它可以这样做:Live Demo

std::cout << json::object"node", json::array;

Boost 没有 JSON 库。它有一个属性树(想想:分层配置格式)库。

文档:http://www.boost.org/doc/libs/1_58_0/doc/html/property_tree/parsers.html#property_tree.parsers.json_parser

它特别指出有些东西没有得到很好的支持:

JSON 中的数组是一个 hack(你不能代表空数组) 所有类型信息都丢失了(一切都需要是 JSON 字符串)

这适合 Boost PropertyTree 的预期应用领域。如果它不适合您的问题,请使用 JSON 库。

【讨论】:

【参考方案2】:

此答案假定,在稍后阶段,您将创建一个属性树字符串。对于这种情况,我找到了一些解决方法。 而不是创建


   "node": ""

您可以轻松创建


   "node": [""]

通过做

ptree parent_tree, children, child;

children.push_back(std::make_pair("", child));
pt.add_child("node", children);

稍后,当您有 json 的字符串表示形式时,您可以将字符 [""] 替换为 []。为此,您只需要这样做:

#include <boost/algorithm/string.hpp>

boost::replace_all(json_string, "[\"\"]", "[]");

这样,你最终会得到一个包含

的字符串

   "node": []

希望这会有所帮助。

【讨论】:

这对我的一个项目帮助很大(在我意识到它的所有限制之前开始使用 boost 的 ptree,我现在不想切换到其他东西,除非我必须这样做。)谢谢你!

以上是关于如何使用 json 解析器的 boost property_tree 创建空数组节点的主要内容,如果未能解决你的问题,请参考以下文章

调用 Boost JSON 解析器永远不会返回

boost::spirit 解析器的编译错误

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

通过使用 boost 属性树解析 JSON 文件来访问布尔值

C++的Json解析库:jsoncpp和boost(转)

C++使用boost 1.75版本来读写JSON文件