【问题标题】:C++ boost property tree getting valuesC ++ boost属性树获取值
【发布时间】:2013-06-13 12:04:24
【问题描述】:

过去 2 天我一直在尝试找出如何在 C++ 中执行以下操作:

我有一个 json 字符串:

[
     {
       "pid" : 0,
       "nick":"Foo",
       "score":12,
       "ping":50
     },
     {
       "pid":1,
       "nick":"Bar",
       "score":23,
       "ping":24
     }
]

我想遍历所有这些孩子并将例如 PlayerID 的值放入 std::vector 中,以便我可以返回所有这些孩子。

我被困的地方在这里:

// some code
boost::property_tree::ptree pt;
boost::property_tree::read_json(ss, pt);

std::vector<int> players;
int pid;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("pid")) // I also tried with pt or pt.get_child("")
{
    pid = v.second.data();
    players.push_back(pid);
}
return players;

我查看了文档,但找不到任何好东西。此外,我已经尝试了几乎所有的东西,如果它编译没有错误,它会给我 what() 预期的对象或类似的东西。我真的被困住了,任何帮助表示赞赏!提前致谢。

【问题讨论】:

    标签: c++ boost boost-propertytree


    【解决方案1】:

    PropertyTree 的 JSON 支持没有类型化 - data() 总是返回一个字符串。

    从解析 JSON 获得的 PTree 应该包含一个根节点,该根节点对于每个数组元素都有一个未命名的子节点。这些孩子中的每一个都有四个命名的孩子的价值。迭代它的代码应该是:

    namespace bpt = boost::property_tree;
    bpt::ptree pt;
    bpt::read_json(ss, pt);
    
    std::vector<int> players;
    int pid;
    
    BOOST_FOREACH(bpt::value_type& v, pt) { // iterate over immediate children of the root
      pid = v.second.get<int>("pid"); // use the converting path getter
      players.push_back(pid);
    }
    

    【讨论】:

    • 我也试过了,现在又试了,但是terminate called after throwing an instance of 'boost::exception_detail::clone_impl&lt;boost::exception_detail::error_info_injector&lt;boost::property_tree::json_parser::json_parser_error&gt; &gt;' what(): &lt;unspecified file&gt;(1): expected object
    • 什么版本的Boost?您正在观察错误 4387 (svn.boost.org/trac/boost/ticket/4387); JSON 解析器不允许顶级数组。我两年前修好了这个。
    • 好吧,根据我的包管理器告诉我的 - “版本:1.42.0”。
    • @SebastianRedl 您现在可能可以读取顶级数组,但仍然无法正确写入它们:(
    • @Dave 啊,很有趣。是的,这可能是个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多