boost: просто перебираем элементы дерева
Это должно быть просто (я просто учусь повышать, поэтому я что-то упускаю)
Я прочитал в некотором простом JSON, используя json_read, и теперь у меня есть 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()) и его соответствующее значение.
Извините если это просто
Росс
5 ответов
Я искал то же самое, и нигде не мог найти ответ. Это оказалось довольно просто:
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");
Спасибо, что указали мне направление, теперь ptree выглядит очень интуитивно, как и другие функции C++ stl.
У меня проблемы с ptree, но, возможно, это поможет: ознакомьтесь с кратким руководством по ptree boost
v.{} ENTRY_NAME
было бы
v.first
а также
v.{значение}
v.second.data ()
Будет ли это работать?
Старый поток, но вот версия ответа 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
Вот отличный пример того, как выполнить итерацию дерева с помощью BOOST_FOREACH 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 Я знаю, что она не очень хорошо документирована, но это полезно.
Этот пример перебирает простой объект 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;
}