strings - definir array string c++



Usar el árbol de propiedades boost para leer int array (2)

Tengo algunos JSON con un puñado de variables de matriz de enteros, así:

{"a": [8, 6, 2], "b": [2, 2, 1]}

Me gustaría utilizar boost property_tree, por ejemplo:

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");

Esto no funciona, ni ninguna variación en un puntero int que he probado. ¿Cómo puedo leer una matriz de un árbol de propiedades?


Answer #1

El soporte de JSON es irregular con el árbol de propiedades boost.

El conjunto de datos del árbol de propiedades no está escrito y no admite matrices como tales. Por lo tanto, se utiliza el siguiente mapeo JSON / árbol de propiedades:

  • Los objetos JSON se asignan a nodos. Cada propiedad es un nodo secundario.
  • Las matrices JSON se asignan a nodos. Cada elemento es un nodo secundario con un nombre vacío. Si un nodo tiene nodos secundarios con nombre y sin nombre, no se puede asignar a una representación JSON.
  • Los valores JSON se asignan a nodos que contienen el valor. Sin embargo, se pierde toda la información de tipo; los números, así como los literales "nulo", "verdadero" y "falso" simplemente se asignan a su forma de cadena.
  • Los nodos del árbol de propiedades que contienen nodos secundarios y datos no se pueden asignar.

(de la documentation )

Puede iterar la matriz con una función de ayuda.

#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 << ' ';
}

Véalo en vivo en Coliru . Salida:

8 6 2 
2 2 1

Answer #2

Lea su lista a continuación:

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




boost-propertytree