我正在尝试使用boost属性树创建一个JSON数组。
documentation说:"JSON数组映射到节点,每个元素都是一个名称为空的子节点。“
因此,我想创建一个名称为空的属性树,然后调用write_json(...)
来取出数组。但是,文档并没有告诉我如何创建未命名的子节点。我尝试过ptree.add_child("", value)
,但结果如下:
Assertion `!p.empty() && "Empty path not allowed for put_child."' failed
文档似乎没有解决这一点,至少在我能理解的任何方式上都没有。有人能帮上忙吗?
发布于 2012-10-10 22:19:35
简单数组:
#include <boost/property_tree/ptree.hpp>
using boost::property_tree::ptree;
ptree pt;
ptree children;
ptree child1, child2, child3;
child1.put("", 1);
child2.put("", 2);
child3.put("", 3);
children.push_back(std::make_pair("", child1));
children.push_back(std::make_pair("", child2));
children.push_back(std::make_pair("", child3));
pt.add_child("MyArray", children);
write_json("test1.json", pt);
结果如下:
{
"MyArray":
[
"1",
"2",
"3"
]
}
对象上的数组:
ptree pt;
ptree children;
ptree child1, child2, child3;
child1.put("childkeyA", 1);
child1.put("childkeyB", 2);
child2.put("childkeyA", 3);
child2.put("childkeyB", 4);
child3.put("childkeyA", 5);
child3.put("childkeyB", 6);
children.push_back(std::make_pair("", child1));
children.push_back(std::make_pair("", child2));
children.push_back(std::make_pair("", child3));
pt.put("testkey", "testvalue");
pt.add_child("MyArray", children);
write_json("test2.json", pt);
结果如下:
{
"testkey": "testvalue",
"MyArray":
[
{
"childkeyA": "1",
"childkeyB": "2"
},
{
"childkeyA": "3",
"childkeyB": "4"
},
{
"childkeyA": "5",
"childkeyB": "6"
}
]
}
希望这能有所帮助
发布于 2010-01-22 10:29:19
你需要做的就是这段有趣的事情。这是我记忆中的,但这样的东西对我来说是有效的。
boost::property_tree::ptree root;
boost::property_tree::ptree child1;
boost::property_tree::ptree child2;
// .. fill in children here with what you want
// ...
ptree.push_back( std::make_pair("", child1 ) );
ptree.push_back( std::make_pair("", child2 ) );
但是要注意,在json解析和编写中有几个But。其中几个我已经提交了错误报告-没有回应:(
EDIT:为了解决将其错误序列化为{"":"","":""}的问题
只有当数组是根元素时,才会发生这种情况。boost ptree编写器将所有根元素视为对象,而不是数组或值。这是由boost/propert_tree/detail/json_parser_writer.hpp中的以下行引起的
else if (indent > 0 && pt.count(Str()) == pt.size())
去掉“缩进>0 &&”将允许它正确地写入数组。
如果您不喜欢所产生的空间大小,可以使用我提供的here补丁
发布于 2012-04-12 07:56:45
在我的例子中,我希望将一个数组添加到一个或多或少的任意位置,因此,就像Michael的答案一样,创建一个子树并用数组元素填充它:
using boost::property_tree::ptree;
ptree targetTree;
ptree arrayChild;
ptree arrayElement;
//add array elements as desired, loop, whatever, for example
for(int i = 0; i < 3; i++)
{
arrayElement.put_value(i);
arrayChild.push_back(std::make_pair("",arrayElement))
}
填充子树后,使用put_child()
或add_child()
函数将整个子树添加到目标树中,如下所示...
targetTree.put_child(ptree::path_type("target.path.to.array"),arrayChild)
put_child函数接受路径和树作为参数,并将arrayChild“移植”到targetTree中
https://stackoverflow.com/questions/2114466
复制相似问题