如何使用 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 ptree 以相同的方式解析 xml 和 json?