Well, I decided it this way (of course, this will not be for everyone, since it is a little hack, which requires further work).
I wrote my own write_json function (just copied the files json_parser.hpp and json_parser_write.hpp into my project) and changed the following lines in json_parser_write.hpp :
- comment line 37 - escape quotation '' '
- line 76 has been changed so that it no longer adds quotation marks:
stream << Ch('"') << data << Ch('"'); ==> stream << data; stream << Ch('"') << data << Ch('"'); ==> stream << data;
Then the values ββwill be saved correctly, except for the lines, so I wrote my own translator for it:
template <typename T> struct my_id_translator { typedef T internal_type; typedef T external_type; boost::optional<T> get_value(const T &v) { return v.substr(1, v.size() - 2) ; } boost::optional<T> put_value(const T &v) { return '"' + v +'"'; } };
and just save the line using:
elem2.put<std::string>("key2", "asdf", my_id_translator<std::string>());
full program:
#include <iostream> #include <string> #include <sstream> #include <boost/property_tree/ptree.hpp> #include "property_tree/json_parser.hpp" // copied the headers template <typename T> struct my_id_translator { typedef T internal_type; typedef T external_type; boost::optional<T> get_value(const T &v) { return v.substr(1, v.size() - 2) ; } boost::optional<T> put_value(const T &v) { return '"' + v +'"'; } }; int main(int, char *[]) { using namespace std; using boost::property_tree::ptree; using boost::property_tree::basic_ptree; try { ptree root, arr,elem2; basic_ptree<std::string, std::string> elem1; elem1.put<int>("int", 10 ); elem1.put<bool>("bool", true); elem2.put<double>("double", 2.2); elem2.put<std::string>("string", "some string", my_id_translator<std::string>()); arr.push_back( std::make_pair("", elem1) ); arr.push_back( std::make_pair("", elem2) ); root.put_child("path1.path2", arr); std::stringstream ss; write_json(ss, root); std::string my_string_to_send_somewhere_else = ss.str(); cout << my_string_to_send_somewhere_else << endl; } catch (std::exception & e) { cout << e.what(); } return 0; }
result:)
{ "path1": { "path2": [ { "int": 10, "bool": true }, { "double": 2.2, "string": "some string" } ] } }
pprzemek May 18 '10 at 20:52 2010-05-18 20:52
source share