2

我正在玩boost::property_tree::ptree,即使用以下json 文件

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

到目前为止,我一直在尝试访问嵌套的“价值”,但没有运气,这就是我所做的:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>

int main(int argc, char *argv[])
{
  const char *filename = argv[1];
  using boost::property_tree::ptree;
  ptree pt;

  read_json(filename, pt);

  std::string v0 = pt.get<std::string>("menu.value"); // ok
  //std::string v1 = pt.get<std::string>("menu.popup.value"); // not ok
  //std::string v2 = pt.get<std::string>("menu.popup.1.value"); // not ok
  //std::string v3 = pt.get<std::string>("menu.popup.''.value"); // not ok

  // ugly solution:
  BOOST_FOREACH(ptree::value_type &v,
    pt.get_child("menu.popup"))
    {
    const ptree &pt2 = v.second;
    std::string s = pt2.get<std::string>("value");
    }
  return 0;
}

到目前为止,我所有“不好”的尝试都失败了。似乎 string_path 不允许访问整个 ptree,正如人们可以想象的那样(想想 XML 世界中的 XPath)。还是我错过了什么?

4

1 回答 1

3

属性树(从 1.54 开始)不支持数组。您可以在此处查看 JSON ptree 序列化程序如何将 JSON 数组对象转换为合适的(未命名;key="")节点。

Ptree 的字符串路径通过键路径解析值(键名称由点分隔)。由于数组对象最终成为未命名的节点,因此如果不迭代根节点的子节点(在本例中为“弹出”),就无法访​​问单个节点。您可以在此处阅读有关如何使用各种 get() 重载的信息

Ptree 的五分钟示例使用一个 XML 源,该源具有一个元素(“模块”)和一个子数组(每个名为“模块”)。就像您的情况一样,正确访问每个的唯一方法是迭代 get_child() 的结果

于 2013-11-08T00:26:38.033 回答