strings definir array c++ json boost boost-propertytree

definir - vector string c++



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

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

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?


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