使用boost :: property_tree :: string_path访问值

时间:2013-09-19 11:40:44

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

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

{
    "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)。或者我错过了什么?

1 个答案:

答案 0 :(得分:3)

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

Ptree的字符串路径通过键路径解析值(其中键名由点分隔)。由于数组对象最终成为未命名的节点,因此无法在不迭代根节点的子节点的情况下访问单个节点(在本例中为“popup”)。您可以阅读有关如何使用various get() overloads here

的信息

Ptree's five minute example使用一个XML源,它有一个元素(“modules”)和一个子数组(每个名为“module”)。就像你的情况一样,正确访问每一个的唯一方法是迭代get_child()的结果