Skip to content

Commit 452f8fe

Browse files
committed
Add dump() method to iotmp_value for JSON text serialization
1 parent c499f7c commit 452f8fe

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

include/thinger/iotmp/core/iotmp_value.hpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)