2012-09-12 12 views

risposta

82

Nota che property_tree interpreta i tasti come percorsi, ad es. mettendo la coppia "a.b" = "z" creerà un {"a": {"b": "z"}} JSON, non un {"a.b": "z"}. Altrimenti, usare property_tree è banale. Ecco un piccolo esempio.

#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

Ho provato questo (usando Boost 1.57.0 per più o meno la prima volta), e VS 2013 mi dà avvertimenti C4512 (operatore di assegnazione non poteva essere generato). Come si risolve questo, oltre a sopprimere gli avvertimenti? – Dabbler

+0

@Dabbler: non ricevo avvertenze con GCC 4.9.1 ('g ++ -c -Wall -O2 -std = C++ 11 pt.cpp'). Non avere un VS. Anche da google, direi che l'avviso proviene da qualche parte più in profondità, perché non ci sono classi definite nel codice dato. Quindi, per rispondere alla tua domanda, penso che dovresti isolare l'avviso, controllando se è prodotto dal codice Boost in proprietà_tree, e se lo fa, cerca il problema Boost corrispondente, presentando un nuovo problema se nessuno lo ha ancora fatto. cf. http://www.boost.org/development/bugs.html – ArtemGr

+0

Ottima risposta. Che ne dici di matrici? – ar2015