Подтвердить что ты не робот

Использование дерева свойств 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, который я пробовал. Как я могу прочитать массив из дерева свойств?

4b9b3361

Ответ 1

Поддержка JSON, пятнистая с деревом свойств boost.

Набор данных дерева свойств не набирается и не поддерживает массивы как таковые. Таким образом, используется следующее JSON/отображение дерева свойств:

  • Объекты JSON сопоставляются с узлами. Каждое свойство является дочерним node.
  • Массивы JSON сопоставляются с узлами. Каждый элемент является дочерним node с пустым именем. Если node имеет именованные и неназванные дочерние узлы, он не может быть отображен в представление 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 << ' ';
}

Смотрите Live On Coliru. Выход:

8 6 2 
2 2 1

Ответ 2

Прочитайте список a следующим образом:

#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
    cout << v.second.data() << endl;
}