Использование дерева свойств boost для чтения массива int
у меня есть JSON с несколькими целочисленными переменными массива, например:
{"a": [8, 6, 2], "b": [2, 2, 1]}
Я хотел бы использовать boost property_tree, например:
std::stringstream ss;
boost::property_tree::ptree pt;
ss << "{"a": [8, 6, 2], "b": [2, 2, 1]}";
boost::property_tree::read_json(ss, pt);
std::vector<int> a = pt.get<std::vector<int> >("a");
это не работает, и никаких изменений в указателе int, который я пробовал. Как я могу прочитать массив из дерева недвижимость?
2 ответов
поддержка JSON, пятнистая с деревом свойств boost.
набор данных дерева свойств не типизирован и не поддерживает массивы как таковые. Таким образом, используется следующее сопоставление дерева JSON / property:
- объекты JSON сопоставляются с узлами. Каждое свойство является дочерним узлом.
- массивы JSON сопоставляются с узлами. Каждый элемент является дочерним узлом с пустым именем. Если узел имеет как именованные, так и неназванные дочерние узлы, он не может быть сопоставлен с Представление JSON.
- значения JSON сопоставляются с узлами, содержащими значение. Однако вся информация о типе теряется; числа, а также литералы "null", "true" и "false" просто сопоставляются с их Строковой формой.
- узлы дерева свойств, содержащие дочерние узлы и данные, не могут быть сопоставлены.
(от документация)
вы можете выполнить итерацию массива с помощью помощника функция.
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
template <typename T>
std::vector<T> as_vector(ptree const& pt, ptree::key_type const& key)
{
std::vector<T> r;
for (auto& item : pt.get_child(key))
r.push_back(item.second.get_value<T>());
return r;
}
int main()
{
std::stringstream ss("{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}");
ptree pt;
read_json(ss, pt);
for (auto i : as_vector<int>(pt, "a")) std::cout << i << ' ';
std::cout << '\n';
for (auto i : as_vector<int>(pt, "b")) std::cout << i << ' ';
}
видеть Жить На Coliru. Вывод:
8 6 2
2 2 1
читать ваши a
список следующим образом:
#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
cout << v.second.data() << endl;
}