diff --git a/AK/JsonArraySerializer.h b/AK/JsonArraySerializer.h index 9a2ae4116b..6bc2c28925 100644 --- a/AK/JsonArraySerializer.h +++ b/AK/JsonArraySerializer.h @@ -61,7 +61,7 @@ public: { begin_item(); m_builder.append('"'); - m_builder.append(value); + m_builder.append_escaped_for_json(value); m_builder.append('"'); } @@ -69,7 +69,7 @@ public: { begin_item(); m_builder.append('"'); - m_builder.append(value); + m_builder.append_escaped_for_json(value); m_builder.append('"'); } @@ -77,7 +77,7 @@ public: { begin_item(); m_builder.append('"'); - m_builder.append(value); + m_builder.append_escaped_for_json(value); m_builder.append('"'); } diff --git a/AK/JsonObject.h b/AK/JsonObject.h index 0cdff4fa54..b8ae907b39 100644 --- a/AK/JsonObject.h +++ b/AK/JsonObject.h @@ -158,33 +158,8 @@ inline void JsonValue::serialize(Builder& builder) const { switch (m_type) { case Type::String: { - auto size = m_value.as_string->length(); builder.append("\""); - for (size_t i = 0; i < size; i++) { - char ch = m_value.as_string->characters()[i]; - switch (ch) { - case '\e': - builder.append("\\u001B"); - break; - case '\b': - builder.append("\\b"); - break; - case '\n': - builder.append("\\n"); - break; - case '\t': - builder.append("\\t"); - break; - case '\"': - builder.append("\\\""); - break; - case '\\': - builder.append("\\\\"); - break; - default: - builder.append(ch); - } - } + builder.append_escaped_for_json({ m_value.as_string->characters(), m_value.as_string->length() }); builder.append("\""); } break; case Type::Array: diff --git a/AK/JsonObjectSerializer.h b/AK/JsonObjectSerializer.h index 9cffa30391..3c73c316d9 100644 --- a/AK/JsonObjectSerializer.h +++ b/AK/JsonObjectSerializer.h @@ -59,7 +59,7 @@ public: { begin_item(key); m_builder.append('"'); - m_builder.append(value); + m_builder.append_escaped_for_json(value); m_builder.append('"'); } @@ -67,7 +67,7 @@ public: { begin_item(key); m_builder.append('"'); - m_builder.append(value); + m_builder.append_escaped_for_json(value); m_builder.append('"'); } @@ -75,7 +75,7 @@ public: { begin_item(key); m_builder.append('"'); - m_builder.append(value); + m_builder.append_escaped_for_json(value); m_builder.append('"'); } @@ -154,7 +154,7 @@ private: m_empty = false; m_builder.append('"'); - m_builder.append(key); + m_builder.append_escaped_for_json(key); m_builder.append("\":"); } diff --git a/AK/StringBuilder.cpp b/AK/StringBuilder.cpp index 15239bfb39..5d317716b4 100644 --- a/AK/StringBuilder.cpp +++ b/AK/StringBuilder.cpp @@ -144,4 +144,32 @@ void StringBuilder::append(const Utf32View& utf32_view) } } +void StringBuilder::append_escaped_for_json(const StringView& string) +{ + for (auto ch : string) { + switch (ch) { + case '\e': + append("\\u001B"); + break; + case '\b': + append("\\b"); + break; + case '\n': + append("\\n"); + break; + case '\t': + append("\\t"); + break; + case '\"': + append("\\\""); + break; + case '\\': + append("\\\\"); + break; + default: + append(ch); + } + } +} + } diff --git a/AK/StringBuilder.h b/AK/StringBuilder.h index 2ef784b29a..cc042e60de 100644 --- a/AK/StringBuilder.h +++ b/AK/StringBuilder.h @@ -49,6 +49,8 @@ public: void appendf(const char*, ...); void appendvf(const char*, va_list); + void append_escaped_for_json(const StringView&); + template void appendff(StringView fmtstr, const Parameters&... parameters) { diff --git a/Kernel/KBufferBuilder.cpp b/Kernel/KBufferBuilder.cpp index 1c3129be4e..f3480b10a2 100644 --- a/Kernel/KBufferBuilder.cpp +++ b/Kernel/KBufferBuilder.cpp @@ -93,4 +93,32 @@ void KBufferBuilder::appendf(const char* fmt, ...) va_end(ap); } +void KBufferBuilder::append_escaped_for_json(const StringView& string) +{ + for (auto ch : string) { + switch (ch) { + case '\e': + append("\\u001B"); + break; + case '\b': + append("\\b"); + break; + case '\n': + append("\\n"); + break; + case '\t': + append("\\t"); + break; + case '\"': + append("\\\""); + break; + case '\\': + append("\\\\"); + break; + default: + append(ch); + } + } +} + } diff --git a/Kernel/KBufferBuilder.h b/Kernel/KBufferBuilder.h index affef2bbe8..9335620a02 100644 --- a/Kernel/KBufferBuilder.h +++ b/Kernel/KBufferBuilder.h @@ -45,6 +45,8 @@ public: void appendf(const char*, ...); void appendvf(const char*, va_list); + void append_escaped_for_json(const StringView&); + template void appendff(StringView fmtstr, const Parameters&... parameters) {