如何使用boost :: property_tree访问JSON数组?

时间:2011-07-01 09:12:20

标签: json boost

{
    "menu": 
    {
        "foo": true,
        "bar": "true",
        "value": 102.3E+06,
        "popup": 
        [
            {"value": "New", "onclick": "CreateNewDoc()"},
            {"value": "Open", "onclick": "OpenDoc()"},
        ]
    }
}

如何获得onclick的值?

1 个答案:

答案 0 :(得分:16)

遍历menu.popup节点的子节点并提取onclick值:

void print_onclick_values(const ptree& node)
{
    BOOST_FOREACH(const ptree::value_type& child,
                  node.get_child("menu.popup")) {
        std::cout
            << "onclick: "
            << child.second.get<std::string>("onclick")
            << "\n";
    }
}

该功能打印:

onclick: CreateNewDoc()
onclick: OpenDoc()

N.B。从示例中删除尾随逗号:

{"value": "Open", "onclick": "OpenDoc()"},

您无法使用单个get<string>(path)get_child(path)来访问阵列的特定子项。 The manual says

  

根据路径,每个级别的结果可能不完全确定,即如果多次出现相同的键,则未指定选择哪个子级。即使存在此路径的后代,这也可能导致路径无法解析。例如:

a -> b -> c
  -> b
  

如果“b”的分辨率选择第一个这样的节点,则路径“a.b.c”将成功,但如果选择第二个节点则失败。

JSON数组的元素都有空字符串作为名称。您可以使用

访问数组元素的onclick
void print_arbitrary_onclick_value(const ptree& node)
{
    std::cout << node.get<std::string>("menu.popup..onclick") << "\n";
}

但您不知道尝试访问onclick的元素。