9

这应该很简单(我只是在学习提升,所以我错过了一些东西)

我已经使用 json_read 阅读了一些简单的 JSON,现在有了一个 ptree。网络上的所有示例都显示使用 ptree.get("entry_name") 获取条目。我想做的就是:

 ptree pt;
 read_json(ss,pt);

 BOOST_FOREACH(ptree::value_type &v, pt)
 {
   std::cout << v.{entry_name} << v.{value}
 }

即遍历 ptree 并写出每个名称(即您放入 pt.get() 的内容)及其对应的值。

对不起,如果这很简单

罗斯

4

5 回答 5

17

我正在寻找同样的东西,但在任何地方都找不到答案。结果确实很简单:

ptree pt;
/* load/fill pt */
for(iterator iter = pt.begin(); iter != pt.end(); iter++)
{
  std::cout << iter->first << "," << iter->second.data() << std::endl;
}

iter->first是条目名称,iter->second.data()是第一级的条目值。iter->second.begin()(然后,您可以使用/重新迭代以end()获得更深层次。)

此外,如果此迭代中的一个这样的节点不是终端节点并且本身是 ptree,则可以从该迭代器本身将其作为 ptree 获取: ptree subPt = iter->second.get_child("nodeName");

于 2012-05-23T14:35:53.793 回答
2

我也遇到了 ptree 的问题,但也许这会有所帮助:查看boost 的 ptree 快速教程

v.{entry_name}
将是
v.first

v.{值}
v.second.data()

那行得通吗?

于 2011-07-18T15:30:48.313 回答
1

这是一个很好的例子,说明如何使用 BOOST_FOREACH http://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/迭代 ptree

对于使用正常的“get”函数直接访问,请查看 boost 中的示例:http: //www.boost.org/doc/libs/1_51_0/doc/html/boost_propertytree/tutorial.html

文档页面位于此处: http: //www.boost.org/doc/libs/1_51_0/doc/html/boost/property_tree/basic_ptree.html 我知道它的文档记录不是很好,但它很有帮助。

于 2012-11-05T09:38:28.907 回答
1

旧线程,但这是mr_georg答案的 C++11 版本,带有基于范围的 for 循环:

ptree pt;
/* load/fill pt */
for(auto pair : pt)
{
  std::cout << pair.first << "," << pair.second.data() << std::endl;
}

对于这个 json:

{
    "key1":"value1",
    "key2":"value2"
}

它输出:

key1,value1
key2,value2
于 2018-06-15T12:57:58.017 回答
0

此示例遍历一个简单的 JSON 对象并将其值放入一个向量中。

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

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

int main (void)
{   
    try
    {        
        std::stringstream ss;
        std::string json_obj_str = "{ \"unit_1\": 1, \"unit_2\": 2, \"unit_3\": 3 }";
        std::vector <float> fvec;

        ss << json_obj_str; // put string into stringstream

        boost::property_tree::ptree pt;
        boost::property_tree::read_json(ss, pt);    // put stringstream into property tree

        // iterate over JSON properties
        for (boost::property_tree::ptree::iterator iter = pt.begin(); iter != pt.end(); iter++)
        {
            std::cout << iter->first << ": " << iter->second.data() << std::endl;
            fvec.push_back(boost::lexical_cast<float>(iter->second.data()));
        }

        for (size_t i = 0; i < fvec.size(); i++)
        {
            std::cout << "fvec.at(" << i << ") = " << fvec.at(i) << std::endl;
        }
    }
    catch (const boost::property_tree::ptree_error &e)
    {
        std::cerr << "property_tree error = " << e.what() << std::endl;
        return -2;
    }       
    catch (std::exception const& e)
    {
        std::cerr << "exception = " << e.what() << std::endl;
        return -1;
    }

    return 0;
}
于 2017-03-24T03:51:42.997 回答