我们如何在 boost 属性树中获取对象

Posted

技术标签:

【中文标题】我们如何在 boost 属性树中获取对象【英文标题】:How do we get objects in boost property tree 【发布时间】:2012-08-10 12:52:15 【问题描述】:

我需要了解和修改示例代码。我被困在某个时候,找不到任何解决方案。代码如下:

void foo(std::istream& input)

    using boost::property_tree::ptree;
    ptree pt;

    boost::property_tree::read_json(input, pt);

    BOOST_FOREACH(ptree::value_type &node, pt.get_child("some_nodes"))
    
        std::string id;
        unsigned int number1;
        bool flag1;
        bool flag2;

        id = node.second.get<std::string>("id");
        number1 = node.second.get<unsigned int>("number1");
        flag1 = node.second.get<bool>("flag1");
        flag2 = node.second.get<bool>("flag2");
    

谁能告诉我这里的“第二”是什么意思?

这是程序读取的 JSON 示例:


    "some_nodes" :
    [
            
                    "id"          : "vader",
                    "number1"     : "1024",
                    "flag1"       : "false",
                    "flag2"       : "true",
            ,
            
                    "id"          : "anakin",
                    "number1"     : "4096",
                    "flag1"       : "true",
                    "flag2"       : "true",     
            
    ]

还有一个问题,当我尝试编译代码时,我也收到以下错误。这是什么意思,我该如何解决?

Invalid arguments '
Candidates are:
boost::foreach_detail_::foreach_reference<#0,#1>::type deref(const boost::foreach_detail_::auto_any_base &, boost::foreach_detail_::type2type<#0,#1> *)
'

非常感谢。

【问题讨论】:

这将有助于发布 xml/json/无论此代码读取的示例。 【参考方案1】:

ptree::value_type 是这样定义的:

typedef std::pair< const Key, self_type >    value_type; 

所以它只是一个 std::pair。 JSON 的根节点是数组“some_nodes”。 当你迭代你的属性树时,你正在迭代所有的“some_nodes”子节点。

第一个字段是键(在这种情况下是隐式的,因为您正在迭代所有根子节点)。我想在你的情况下 node.first 总是“some_nodes”。 second 是值(键的子节点:另一个 ptree)。在这种情况下,在每次迭代中,第二个都是数组的第 i 个未命名对象。

【讨论】:

我对 JSON 不熟悉,所以我希望我说的是对的。我只将它与 XML 一起使用。在每一层,第一个元素是父节点,第二个元素是它的一个子节点。

以上是关于我们如何在 boost 属性树中获取对象的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名提升属性树中的节点/元素?

在源码树中获取 boost:shared_ptr 的 get 方法的所有使用列表

使用 boost 属性树遍历 json 属性键和值

如何从 boost::interprocess::managed_shared_memory 对象中获取 shmid

如何获取错误对象?在deadline_timer中使用成员函数时

Boost.Python 对象的 id