我们如何在boost属性树中获取对象

时间:2012-08-10 12:52:16

标签: c++ json boost boost-propertytree boost-foreach

我需要了解并修改示例代码。我陷入困境,无法找到任何解决方案。这是代码:

void foo(std::istream& input)
{
    using boost::property_tree::ptree;
    ptree pt;

    boost::property_tree::read_json(input, pt);

    BOOST_FOREACH(ptree::value_type &node, pt.get_child("some_nodes"))
    {
        std::string id;
        unsigned int number1;
        bool flag1;
        bool flag2;

        id = node.second.get<std::string>("id");
        number1 = node.second.get<unsigned int>("number1");
        flag1 = node.second.get<bool>("flag1");
        flag2 = node.second.get<bool>("flag2");
    }
}

有人可以告诉我'第二'在这里意味着什么吗?

以下是程序读取的JSON示例:

{
    "some_nodes" :
    [
            {
                    "id"          : "vader",
                    "number1"     : "1024",
                    "flag1"       : "false",
                    "flag2"       : "true",
            },
            {
                    "id"          : "anakin",
                    "number1"     : "4096",
                    "flag1"       : "true",
                    "flag2"       : "true",     
            }
    ]
}

还有一个问题,我在尝试编译代码时也遇到以下错误。这意味着什么,我该如何解决?

Invalid arguments '
Candidates are:
boost::foreach_detail_::foreach_reference<#0,#1>::type deref(const boost::foreach_detail_::auto_any_base &, boost::foreach_detail_::type2type<#0,#1> *)
'

非常感谢。

1 个答案:

答案 0 :(得分:1)

ptree :: value_type以这种方式定义:

typedef std::pair< const Key, self_type >    value_type; 

所以它只是一个std ::对。 JSON的根节点是数组“some_nodes”。 当您迭代属性树时,您将遍历所有“some_nodes”子节点。

  • 第一个字段是键(在这种情况下隐含,因为您正在迭代所有根子节点)。我想在你的情况下node.first总是“some_nodes”。
  • second是值(密钥的子节点:另一个ptree)。在这种情况下,在每次迭代时,第二个是数组的第i个未命名对象。