2012-09-12 23 views

Respuesta

82

Tenga en cuenta que property_tree interpreta las claves como rutas, p. Ej. poner el par "a.b" = "z" creará un {"a": {"b": "z"}} JSON, no un {"a.b": "z"}. De lo contrario, usar property_tree es trivial. Aquí hay un pequeño ejemplo.

#include <sstream> 
#include <map> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 

using boost::property_tree::ptree; 
using boost::property_tree::read_json; 
using boost::property_tree::write_json; 

void example() { 
    // Write json. 
    ptree pt; 
    pt.put ("foo", "bar"); 
    std::ostringstream buf; 
    write_json (buf, pt, false); 
    std::string json = buf.str(); // {"foo":"bar"} 

    // Read json. 
    ptree pt2; 
    std::istringstream is (json); 
    read_json (is, pt2); 
    std::string foo = pt2.get<std::string> ("foo"); 
} 

std::string map2json (const std::map<std::string, std::string>& map) { 
    ptree pt; 
    for (auto& entry: map) 
     pt.put (entry.first, entry.second); 
    std::ostringstream buf; 
    write_json (buf, pt, false); 
    return buf.str(); 
} 
+1

Intenté esto (usando Boost 1.57.0 por más o menos la primera vez), y VS 2013 me da advertencias C4512 (no se pudo generar el operador de asignación). ¿Cómo puede uno resolver eso, además de suprimir las advertencias? – Dabbler

+0

@Dabbler: No recibo advertencias con GCC 4.9.1 ('g ++ -c -Wall -O2 -std = C++ 11 pt.cpp'). No tiene un VS. También de Google, diría que la advertencia viene de algún lugar más profundo, porque no hay clases definidas en el código dado. Entonces, para responder a su pregunta, creo que debe aislar la advertencia, verificando si es producida por el código de Boost en property_tree, y si lo hace, busque el problema correspondiente de Boost, y presente un nuevo problema si aún nadie lo hizo. cf. http://www.boost.org/development/bugs.html – ArtemGr

+0

Gran respuesta. ¿Qué hay de las matrices? – ar2015

Cuestiones relacionadas