这应该很简单(我只是学习提升,所以我错过了一些东西)
我已经使用json_read阅读了一些简单的JSON,现在有了一个ptree。 Web上的所有示例都使用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()的内容)和它的相应值。
很抱歉,如果这很简单
罗斯
答案 0 :(得分:16)
我正在搜索同样的事情,无法在任何地方找到答案。事实证明它非常简单:
ptree pt;
/* load/fill pt */
for(iterator iter = pt.begin(); iter != pt.end(); iter++)
{
std::cout << iter->first << "," << iter->second.data() << std::endl;
}
iter-&gt;首先是条目名称,iter-&gt; second.data()是第一级的条目值。 (然后你可以用iter-&gt; second.begin()/ end()重新迭代更深层次。)
此外,如果此迭代中的一个此类节点不是终端节点并且本身是一个ptree,则可以从此迭代器本身将其作为ptree获取: ptree subPt = iter-&gt; second.get_child(“nodeName”);
感谢您为我提供了理解它的方向,ptree现在看起来非常直观,就像其他C ++ stl函数一样。
答案 1 :(得分:2)
我也遇到过ptree问题,但也许这有助于: 查看boost's ptree quick tutorial
诉{ENTRY_NAME}
将是 v.first
和
诉{值}
v.second.data()
那会有用吗?
答案 2 :(得分:1)
旧线程,但这里是mr_georg's的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
答案 3 :(得分:0)
以下是如何使用BOOST_FOREACH迭代ptree的一个很好的示例 http://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/
使用普通的“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 我知道它没有很好的记录,但它很有帮助。
答案 4 :(得分: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;
}