Property Tree (Boost) (C++)

TEORÍA

Los Property Trees (ptree) de la biblioteca Boost para C++ nos permitirán crear dinámicamente estructuras de datos (similares a un mapa) que sean fácilmente serializables a XML, JSON, INI e INFO.

PRÁCTICA

POBLACIÓN

Añadir nodos al «ptree» es común, la serialización a un tipo u otro de formato será lo que difiera.

En los ejemplos se muestra cómo quedaría el resultado en JSON pero la idea es la misma para los demás formatos.

#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>
using namespace std;
using namespace boost::property_tree;
//...
ptree nodoPadre;

// AÑADIR UN HIJO CON CLAVE ÚNICA
valor = 1; //tipos básicos
nodoPadre.put("clave", valor);

// AÑADIR UN SUBNODO PTREE 
ptree nodoHijo;
nodoPadre.add_child("nodoHijo", nodoHijo);

// AÑADIR UN ARRAY DE ELEMENTOS/NODOS
ptree pt;
ptree children;
ptree child1, child2, child3;

child1.put("", 1);
child2.put("", 2);
child3.put("", 3);

// El primer valor de "make_pair" debe ser la 
// cadena vacía o sino, el array será interpretado
// como un objeto JSON en lugar de un array
children.push_back(std::make_pair("", child1));
children.push_back(std::make_pair("", child2));
children.push_back(std::make_pair("", child3));

pt.add_child("MyArray", children);

/*
result:
{
    "MyArray": 
    [
        "1",
        "2",
        "3"
    ]
}
*/

// Si el primer valor no es la cadena vacía
children.push_back(std::make_pair("1", child1));
children.push_back(std::make_pair("2", child2));
children.push_back(std::make_pair("3", child3));

/*
result:
{
    "MyArray": 
    {
        "1": "1",
        "2": "2",
        "3": "3"
    }
}
*/

// NOTA: Si el array está vacío, se le asigna una cadena vacía
ptree ptVacio;
pt.add_child("MyArray", ptVacio);

/*
result:
{
    "MyArray": ""
}
*/

SERIALIZACIÓN

JSON
// SERIALIZAR A JSON
#include <boost/property_tree/json_parser.hpp>

ptree mi_ptree;
ostringstream buf;
write_json(buf, mi_ptree, false);
string jsonSerializado = buf.str();

 

Deja un comentario