我正在尝试使用boost属性树创建JSON数组。
文档中写道:"JSON数组Map到节点。每个元素都是一个名称为空的子节点。"
所以我想创建一个空名称的属性树,然后调用write_json(...)
来得到数组,但是文档没有告诉我如何创建未命名的子节点,我尝试了ptree.add_child("", value)
,但是得到了:
Assertion `!p.empty() && "Empty path not allowed for put_child."' failed
文档似乎没有提到这一点,至少我想不出有什么办法。有人能帮忙吗?
7条答案
按热度按时间3npbholx1#
简单阵列:
结果:
对象上的数组:
结果:
x7rlezfr2#
你要做的就是找点乐子。这是我的记忆,但我喜欢这样。
但是要注意在json解析和编写中有几个bug,其中几个我已经提交了bug报告,但没有得到回应:(
编辑:解决其序列化错误为{":“,":“}的问题
只有当数组是根元素时才会发生这种情况。boost ptree编写器将所有根元素都视为对象,而不是数组或值。这是由boost/propert_tree/detail/json_parser_writer.hpp中的以下行导致的
去掉“indent〉0 &&”将允许它正确地写入数组。
如果您不喜欢生成的空间大小,可以使用我提供的补丁here
egdjgwm83#
在开始使用属性树来表示JSON结构时,我遇到了类似的问题,但我没有解决。还要注意,从文档中可以看出,属性树并不完全支持类型信息:
JSON值被Map到包含该值的节点,但是所有类型信息都丢失了;数字以及文字“空”、“真”和“假”被简单地Map到它们的字符串形式。
了解了这些之后,我切换到了更完整的JSON实现JSON Spirit。这个库使用Boost Spirit进行JSON语法实现,完全支持包含数组的JSON。
我建议您使用另一种C++ JSON实现。
irlmq6kh4#
在我的例子中,我想将一个数组添加到一个或多或少任意的位置,因此,就像Michael的答案一样,创建一个子树,并使用数组元素填充它:
填充完子树后,使用
put_child()
或add_child()
函数将整个子树添加到目标树中,如下所示...put_child函数接受路径和树作为参数,并将arrayChild“移植”到targetTree中
mzillmmw5#
截至
boost 1.60.0
,问题仍然存在。提供
Python 3
解决方案(Gist),可以在boost::property_tree::write_json
之后立即进行系统调用。ckocjqey6#
如果你想在C++中使用JSON,就不需要Boost了。有了这个库,你可以把JSON作为第一类数据类型,它的行为就像STL容器一样。
2uluyalo7#
对官方文件和以上回答感到困惑。以下是我的理解。
属性树由节点组成。
每个节点如下所示
使用“put”将“value”放入数据
要使用“push_back”将“node”放入子节点,\