12 #ifndef ZYPP_BASE_JSON_H
13 #define ZYPP_BASE_JSON_H
32 inline static const std::string &
nullJSON() {
static const std::string _s(
"null" );
return _s; }
33 inline static const std::string &
trueJSON() {
static const std::string _s(
"true" );
return _s; }
34 inline static const std::string &
falseJSON() {
static const std::string _s(
"false" );
return _s; }
41 typedef unsigned char uchar;
44 for_( r, val_r.begin(), val_r.end() )
46 if ( uchar(*r) < 32u )
75 val_r.resize( val_r.size() + add,
'@' );
76 auto w( val_r.rbegin() );
80 for ( ; r != val_r.rend(); ++r )
82 if ( uchar(*r) < 32u )
84 static const char * digit =
"0123456789abcdef";
108 *w++ = digit[uchar(*r) % 15];
109 *w++ = digit[uchar(*r) / 16];
119 switch ( (*w++ = *r) )
159 template <
class V> std::string
toJSON(
const std::vector<V> & cont_r );
160 template <
class V> std::string
toJSON(
const std::list<V> & cont_r );
161 template <
class V> std::string
toJSON(
const std::set<V> & cont_r );
164 template <
class K,
class V> std::string
toJSON(
const std::map<K,V> & cont_r );
176 std::string
toJSON(
const T & val_r ) {
return val_r.asJSON(); }
223 std::ostream &
dumpOn( std::ostream & str )
const
224 {
return str <<
_data; }
232 {
return obj.
dumpOn( str ); }
261 template <
class Iterator>
262 Array( Iterator begin, Iterator end )
263 {
for_( it, begin, end )
add( *it ); }
266 Array(
const std::initializer_list<Value> & contents_r )
267 :
Array( contents_r.begin(), contents_r.end() )
275 void add(
const std::initializer_list<Value> & contents_r )
276 {
for_( it, contents_r.begin(), contents_r.end() )
add( *it ); }
287 std::ostream &
dumpOn( std::ostream & str )
const
291 str <<
'[' << *
_data.begin();
303 {
return obj.
dumpOn( str ); }
306 std::string
toJSON(
const std::vector<V> & cont_r )
307 {
return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); }
310 std::string
toJSON(
const std::list<V> & cont_r )
311 {
return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); }
314 std::string
toJSON(
const std::set<V> & cont_r )
315 {
return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); }
326 template <
class Iterator>
328 {
for_( it, begin, end )
add( it->first, it->second ); }
331 Object(
const std::initializer_list<std::pair<String, Value>> & contents_r )
332 :
Object( contents_r.begin(), contents_r.end() )
340 void add(
const std::initializer_list<std::pair<String, Value>> & contents_r )
341 {
for_( it, contents_r.begin(), contents_r.end() )
add( it->first, it->second ); }
352 std::ostream &
dumpOn( std::ostream & str )
const
359 dumpOn( str <<
',' << endl, val );
360 return str << endl <<
'}';
364 std::ostream &
dumpOn( std::ostream & str, std::map<std::string,std::string>::const_iterator val_r )
const
365 {
return str << val_r->first <<
": " << val_r->second; }
367 std::map<std::string,std::string>
_data;
372 {
return obj.
dumpOn( str ); }
374 template <
class K,
class V>
375 std::string
toJSON(
const std::map<K,V> & cont_r )
376 {
return json::Object( cont_r.begin(), cont_r.end() ).asJSON(); }
383 #endif // ZYPP_BASE_JSON_H
std::string asString() const
String representation.
std::string asJSON() const
JSON representation.
Array(Iterator begin, Iterator end)
Construct from container iterator.
static const std::string & nullJSON()
std::ostream & operator<<(std::ostream &str, const Object &obj)
String(const char *val_r)
std::map< std::string, std::string > _data
Object(const std::initializer_list< std::pair< String, Value >> &contents_r)
Construct from map-initializer list { {k1,v1}, {k2,v2},...
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
JSON representation of datatypes via toJSON.
std::ostream & dumpOn(std::ostream &str) const
Stream output.
Value(const Value &rhs)
Copy ctor.
void add(const std::initializer_list< std::pair< String, Value >> &contents_r)
void add(const std::initializer_list< Value > &contents_r)
std::ostream & operator<<(std::ostream &str, const Value &obj)
const std::string & asJSON() const
JSON representation.
static const std::string & trueJSON()
std::string strEncode(std::string val_r)
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
std::list< std::string > _data
std::ostream & dumpOn(std::ostream &str) const
Stream output.
std::string numstring(char n, int w=0)
std::string asJSON() const
JSON representation.
static const std::string & falseJSON()
String(const std::string &val_r)
void add(const Value &val_r)
Push JSON Value to Array.
std::string asString() const
String representation.
std::ostream & dumpOn(std::ostream &str, std::map< std::string, std::string >::const_iterator val_r) const
Object(Iterator begin, Iterator end)
Construct from map-iterator.
Value(const T &val_r)
Ctor creating a JSON representation of T via toJSON(T)
void add(const String &key_r, const Value &val_r)
Add key/value pair.
const std::string & asString() const
String representation.
std::ostream & operator<<(std::ostream &str, const Array &obj)
Value()
Default ctor (null)
JSON string Force representation as JSON string, mapping e.g.
Array(const std::initializer_list< Value > &contents_r)
Construct from container initializer list { v1, v2,...
std::ostream & dumpOn(std::ostream &str) const
Stream output.