1

我需要理解和修改示例代码。我被困在某个时候,找不到任何解决方案。这是代码:

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> *)
'

非常感谢。

4

1 回答 1

1

ptree::value_type 是这样定义的:

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

所以它只是一个 std::pair。JSON 的根节点是数组“some_nodes”。当你迭代你的属性树时,你正在迭代所有“some_nodes”子节点。

  • 第一个字段是键(在这种情况下是隐含的,因为您正在迭代所有根子节点)。我想在你的情况下 node.first 总是“some_nodes”。
  • 第二个是值(键的子节点:另一个 ptree)。在这种情况下,在每次迭代中,第二个都是数组的第 i 个未命名对象。
于 2012-08-10T13:16:01.723 回答