@@ -98,6 +98,22 @@ class iotmp_value {
9898 array_t * arr_ptr () const { return static_cast <array_t *>(data_.ptr ); }
9999 object_t * obj_ptr () const { return static_cast <object_t *>(data_.ptr ); }
100100
101+ static std::string escape_json (const std::string& s) {
102+ std::string result;
103+ result.reserve (s.size ());
104+ for (char c : s) {
105+ switch (c) {
106+ case ' "' : result += " \\\" " ; break ;
107+ case ' \\ ' : result += " \\\\ " ; break ;
108+ case ' \n ' : result += " \\ n" ; break ;
109+ case ' \r ' : result += " \\ r" ; break ;
110+ case ' \t ' : result += " \\ t" ; break ;
111+ default : result += c; break ;
112+ }
113+ }
114+ return result;
115+ }
116+
101117 // Ensure this value is an object (auto-promote from null)
102118 object_t & ensure_object () {
103119 if (type_ != value_t ::object) {
@@ -353,6 +369,41 @@ class iotmp_value {
353369 }
354370 }
355371
372+ // ======================== JSON serialization ========================
373+
374+ std::string dump () const {
375+ switch (type_) {
376+ case value_t ::null: return " null" ;
377+ case value_t ::boolean: return data_.b ? " true" : " false" ;
378+ case value_t ::number_unsigned: return std::to_string (data_.u );
379+ case value_t ::number_integer: return std::to_string (data_.i );
380+ case value_t ::number_float: return std::to_string (data_.d );
381+ case value_t ::string:
382+ return " \" " + escape_json (*str_ptr ()) + " \" " ;
383+ case value_t ::binary:
384+ return " \" <binary:" + std::to_string (bin_ptr ()->size ()) + " >\" " ;
385+ case value_t ::array: {
386+ std::string s = " [" ;
387+ const auto & arr = *arr_ptr ();
388+ for (size_t i = 0 ; i < arr.size (); ++i) {
389+ if (i > 0 ) s += " ," ;
390+ s += arr[i].dump ();
391+ }
392+ return s + " ]" ;
393+ }
394+ case value_t ::object: {
395+ std::string s = " {" ;
396+ const auto & obj = *obj_ptr ();
397+ for (size_t i = 0 ; i < obj.size (); ++i) {
398+ if (i > 0 ) s += " ," ;
399+ s += " \" " + escape_json (obj[i].first ) + " \" :" + obj[i].second .dump ();
400+ }
401+ return s + " }" ;
402+ }
403+ default : return " null" ;
404+ }
405+ }
406+
356407 // ======================== Swap ========================
357408
358409 void swap (iotmp_value& o) noexcept {
0 commit comments