int JSON_EncodeValue(json_buf* buf, DynamicObject& obj) { switch (obj.type) { case DO_UNKNOWN: return json_write_null(buf); case DO_INTEGER: return json_write_integer(buf, obj); case DO_BOOLEAN: return json_write_bool(buf, obj); case DO_NUMBER: return json_write_number(buf, obj); case DO_STRING: return json_write_string(buf, obj); case DO_ARRAY: { int len = json_putch(buf, '['); size_t size = obj.size(); for (size_t i = 0; i < size; i++) { len += JSON_EncodeValue(buf, obj[i]); if (i != size - 1) len += json_putch(buf, ','); } len += json_putch(buf, ']'); return len; } case DO_OBJECT: { int len = json_putch(buf, '{'); std::vector<std::string> keys; obj.propertyList(keys); size_t size = keys.size(); for (size_t i = 0; i < size; i++) { std::string& key = keys[i]; len += json_write_string(buf, (char*)key.c_str()); len += json_putch(buf, ':'); len += JSON_EncodeValue(buf, obj[key]); if (i != keys.size() - 1) len += json_putch(buf, ','); } len += json_putch(buf, '}'); return len; } default: return 0; } }