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

wyz*_*889 8 json boost

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

我怎样才能获得onclick的价值?

ant*_*kos 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

功能打印:

onclick: CreateNewDoc()
onclick: OpenDoc()
Run Code Online (Sandbox Code Playgroud)

NB从示例中删除尾随逗号:

{"value": "Open", "onclick": "OpenDoc()"},
Run Code Online (Sandbox Code Playgroud)

您无法使用单个get<string>(path)get_child(path)调用访问阵列的特定子级.手册说:

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

a -> b -> c
  -> b
Run Code Online (Sandbox Code Playgroud)

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

JSON数组的元素都具有空字符串作为名称.您可以使用onclick数组元素访问值

void print_arbitrary_onclick_value(const ptree& node)
{
    std::cout << node.get<std::string>("menu.popup..onclick") << "\n";
}
Run Code Online (Sandbox Code Playgroud)

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

  • 使用单个“get()”访问该元素是“不可能”的。放弃。使用迭代器接口(请参阅我的第一个示例)来访问数组元素。 (2认同)