/** * Creates a JSON encoded string for the value with all necessary characters escaped * * @access public * * @return std::wstring Returns the JSON string */ std::wstring JSONValue::Stringify() const { std::wstring ret_string; switch (type) { case JSONType_Null: ret_string = L"null"; break; case JSONType_String: ret_string = StringifyString(string_value); break; case JSONType_Bool: ret_string = bool_value ? L"true" : L"false"; break; case JSONType_Number: { if (isinf(number_value) || isnan(number_value)) ret_string = L"null"; else { std::wstringstream ss; ss.precision(15); ss << number_value; ret_string = ss.str(); } break; } case JSONType_Array: { ret_string = L"["; JSONArray::const_iterator iter = array_value.begin(); while (iter != array_value.end()) { ret_string += (*iter)->Stringify(); // Not at the end - add a separator if (++iter != array_value.end()) ret_string += L","; } ret_string += L"]"; break; } case JSONType_Object: { ret_string = L"{"; JSONObject::const_iterator iter = object_value.begin(); while (iter != object_value.end()) { ret_string += StringifyString((*iter).first); ret_string += L":"; ret_string += (*iter).second->Stringify(); // Not at the end - add a separator if (++iter != object_value.end()) ret_string += L","; } ret_string += L"}"; break; } } return ret_string; }
/** * Creates a JSON encoded string for the value with all necessary characters escaped * * @access private * * @param size_t indentDepth The prettyprint indentation depth (0 : no prettyprint) * * @return std::string Returns the JSON string */ std::string JSONValue::StringifyImpl(size_t const indentDepth) const { std::string ret_string; size_t const indentDepth1 = indentDepth ? indentDepth + 1 : 0; std::string const indentStr = Indent(indentDepth); std::string const indentStr1 = Indent(indentDepth1); switch (type) { case JSONType_Null: ret_string = "nu"; break; case JSONType_String: ret_string = StringifyString(string_value); break; case JSONType_Bool: ret_string = bool_value ? "true" : "false"; break; case JSONType_Number: { if (isinf(number_value) || isnan(number_value)) ret_string = "nu"; else { std::stringstream ss; ss.precision(15); ss << number_value; ret_string = ss.str(); } break; } case JSONType_Array: { ret_string = indentDepth ? "[\n" + indentStr1 : "["; JSONArray::const_iterator iter = array_value.begin(); while (iter != array_value.end()) { ret_string += (*iter)->StringifyImpl(indentDepth1); // Not at the end - add a separator if (++iter != array_value.end()) ret_string += ","; } ret_string += indentDepth ? "\n" + indentStr + "]" : "]"; break; } case JSONType_Object: { ret_string = indentDepth ? "{\n" + indentStr1 : "{"; JSONObject::const_iterator iter = object_value.begin(); while (iter != object_value.end()) { ret_string += StringifyString((*iter).first); ret_string += ":"; ret_string += (*iter).second->StringifyImpl(indentDepth1); // Not at the end - add a separator if (++iter != object_value.end()) ret_string += ","; } ret_string += indentDepth ? "\n" + indentStr + "}" : "}"; break; } } return ret_string; }