首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用属性树在Boost中创建JSON数组

使用属性树在Boost中创建JSON数组
EN

Stack Overflow用户
提问于 2010-01-22 09:58:14
回答 6查看 69.8K关注 0票数 72

我正在尝试使用boost属性树创建一个JSON数组。

documentation说:"JSON数组映射到节点,每个元素都是一个名称为空的子节点。“

因此,我想创建一个名称为空的属性树,然后调用write_json(...)来取出数组。但是,文档并没有告诉我如何创建未命名的子节点。我尝试过ptree.add_child("", value),但结果如下:

代码语言:javascript
复制
Assertion `!p.empty() && "Empty path not allowed for put_child."' failed

文档似乎没有解决这一点,至少在我能理解的任何方式上都没有。有人能帮上忙吗?

EN

回答 6

Stack Overflow用户

发布于 2012-10-10 22:19:35

简单数组:

代码语言:javascript
复制
#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);

结果如下:

代码语言:javascript
复制
{
    "MyArray":
    [
        "1",
        "2",
        "3"
    ]
}

对象上的数组:

代码语言:javascript
复制
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);

结果如下:

代码语言:javascript
复制
{
    "testkey": "testvalue",
    "MyArray":
    [
        {
            "childkeyA": "1",
            "childkeyB": "2"
        },
        {
            "childkeyA": "3",
            "childkeyB": "4"
        },
        {
            "childkeyA": "5",
            "childkeyB": "6"
        }
    ]
}

希望这能有所帮助

票数 119
EN

Stack Overflow用户

发布于 2010-01-22 10:29:19

你需要做的就是这段有趣的事情。这是我记忆中的,但这样的东西对我来说是有效的。

代码语言:javascript
复制
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中的以下行引起的

代码语言:javascript
复制
else if (indent > 0 && pt.count(Str()) == pt.size())

去掉“缩进>0 &&”将允许它正确地写入数组。

如果您不喜欢所产生的空间大小,可以使用我提供的here补丁

票数 22
EN

Stack Overflow用户

发布于 2012-04-12 07:56:45

在我的例子中,我希望将一个数组添加到一个或多或少的任意位置,因此,就像Michael的答案一样,创建一个子树并用数组元素填充它:

代码语言:javascript
复制
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()函数将整个子树添加到目标树中,如下所示...

代码语言:javascript
复制
targetTree.put_child(ptree::path_type("target.path.to.array"),arrayChild)

put_child函数接受路径和树作为参数,并将arrayChild“移植”到targetTree中

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2114466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档