From ae54cd78f5f71d5e926c646a0b76f5de34bfec7a Mon Sep 17 00:00:00 2001 From: Don Park Date: Wed, 17 Nov 2021 21:34:00 -0800 Subject: [PATCH] json2: encode ascii chars < 0x20 in json (#12494) --- vlib/x/json2/decoder_test.v | 7 +++++++ vlib/x/json2/encoder.v | 3 +++ vlib/x/json2/encoder_test.v | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/vlib/x/json2/decoder_test.v b/vlib/x/json2/decoder_test.v index d6b0d10340..c14e33a567 100644 --- a/vlib/x/json2/decoder_test.v +++ b/vlib/x/json2/decoder_test.v @@ -5,6 +5,13 @@ fn test_raw_decode_string() ? { assert str.str() == 'Hello!' } +fn test_raw_decode_string_escape() ? { + jstr := raw_decode('"\u001b"') ? + str := jstr.str() + assert str.len == 1 + assert str[0] == 27 +} + fn test_raw_decode_number() ? { num := raw_decode('123') ? assert num.int() == 123 diff --git a/vlib/x/json2/encoder.v b/vlib/x/json2/encoder.v index b1ca0e49e7..8f6cc50804 100644 --- a/vlib/x/json2/encoder.v +++ b/vlib/x/json2/encoder.v @@ -150,6 +150,9 @@ fn json_string(s string) string { } } else if chr == `"` || chr == `/` || chr == `\\` { sb.write_string('\\' + chr.ascii_str()) + } else if int(chr) < 0x20 { + hex_code := chr.hex() + sb.write_string('\\u00$hex_code') } else { sb.write_b(chr) } diff --git a/vlib/x/json2/encoder_test.v b/vlib/x/json2/encoder_test.v index 813517216c..ea7807df9f 100644 --- a/vlib/x/json2/encoder_test.v +++ b/vlib/x/json2/encoder_test.v @@ -5,6 +5,13 @@ fn test_json_string_characters() { assert text.json_str() == '\\n\\r\\b\\f\\t\\\\\\"\\/' } +fn test_json_escape_low_chars() { + esc := '\u001b' + assert esc.len == 1 + text := json2.Any(esc) + assert text.json_str() == r'\u001b' +} + fn test_json_string() { text := json2.Any('te✔st') assert text.json_str() == r'te\u2714st'