c++ - 使用 boost::property_tree::string_path 访问值

标签 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.54 起)不支持数组。您可以看到 JSON ptree 序列化器如何将 JSON 数组对象转换为合适的(未命名;key="")节点 here .

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

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

关于c++ - 使用 boost::property_tree::string_path 访问值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18893642/

相关文章:

java - 使用从 Json 响应传递的对象填充 JTable

c++ - 尝试在 Blackberry Cascades QT 和 QML 中下载图像

c++ - 指向派生类的指针是否首先创建基类?

json - WCF 服务速度慢 - 有选项吗?

mysql - Rails 将 JSON 序列化为字符串在 mysql JSON 字段上出现错误

c++ - 使用 CMake 链接 Boost 库的静态版本

c++ - 如何使用 _GLIBCXX_DEBUG 构建 Boost 版本?

c++ - 如果在 linux Ubuntu :)10. 10 中包含 boost/thread,则不会编译

c++ - C++ 的模块标准是否解决了对调用者隐藏私有(private)数据的问题?

c++ - STL 中有解引用迭代器吗?