From fa282334051b16df91ca097dd7304b46f3bc7719 Mon Sep 17 00:00:00 2001 From: Francois Chagnon Date: Mon, 9 Feb 2015 21:09:33 +0000 Subject: [PATCH] add forward slash to escape character --- ext/json/ext/generator/generator.c | 7 +++++++ java/src/json/ext/StringEncoder.java | 1 + lib/json/pure/generator.rb | 9 +++++---- tests/test_json.rb | 6 +++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index 6300c64f..98748325 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -171,6 +171,9 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string) case '\\': fbuffer_append(buffer, "\\\\", 2); break; + case '/': + fbuffer_append(buffer, "\\/", 2); + break; case '"': fbuffer_append(buffer, "\\\"", 2); break; @@ -268,6 +271,10 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string) escape = "\\\\"; escape_len = 2; break; + case '/': + escape = "\\/"; + escape_len = 2; + break; case '"': escape = "\\\""; escape_len = 2; diff --git a/java/src/json/ext/StringEncoder.java b/java/src/json/ext/StringEncoder.java index 57bd19bc..fe1a8143 100644 --- a/java/src/json/ext/StringEncoder.java +++ b/java/src/json/ext/StringEncoder.java @@ -50,6 +50,7 @@ void encode(ByteList src, ByteList out) { private void handleChar(int c) { switch (c) { case '"': + case '/': case '\\': escapeChar((char)c); break; diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb index 9056a5d7..36d9f421 100644 --- a/lib/json/pure/generator.rb +++ b/lib/json/pure/generator.rb @@ -34,6 +34,7 @@ module JSON "\x1f" => '\u001f', '"' => '\"', '\\' => '\\\\', + '/' => '\\/', } # :nodoc: # Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with @@ -42,7 +43,7 @@ module JSON def utf8_to_json(string) # :nodoc: string = string.dup string.force_encoding(::Encoding::ASCII_8BIT) - string.gsub!(/["\\\x0-\x1f]/) { MAP[$&] } + string.gsub!(/[\/"\\\x0-\x1f]/) { MAP[$&] } string.force_encoding(::Encoding::UTF_8) string end @@ -50,7 +51,7 @@ def utf8_to_json(string) # :nodoc: def utf8_to_json_ascii(string) # :nodoc: string = string.dup string.force_encoding(::Encoding::ASCII_8BIT) - string.gsub!(/["\\\x0-\x1f]/n) { MAP[$&] } + string.gsub!(/[\/"\\\x0-\x1f]/n) { MAP[$&] } string.gsub!(/( (?: [\xc2-\xdf][\x80-\xbf] | @@ -79,11 +80,11 @@ def valid_utf8?(string) module_function :valid_utf8? else def utf8_to_json(string) # :nodoc: - string.gsub(/["\\\x0-\x1f]/n) { MAP[$&] } + string.gsub(/[\/"\\\x0-\x1f]/n) { MAP[$&] } end def utf8_to_json_ascii(string) # :nodoc: - string = string.gsub(/["\\\x0-\x1f]/) { MAP[$&] } + string = string.gsub(/[\/"\\\x0-\x1f]/) { MAP[$&] } string.gsub!(/( (?: [\xc2-\xdf][\x80-\xbf] | diff --git a/tests/test_json.rb b/tests/test_json.rb index 7957773f..aa4f75ce 100755 --- a/tests/test_json.rb +++ b/tests/test_json.rb @@ -409,10 +409,10 @@ def test_backslash assert_equal json, JSON.generate(data) assert_equal data, JSON.parse(json) # - json = '["/"]' - data = JSON.parse(json) - assert_equal ['/'], data + data = [ '/' ] + json = '["\/"]' assert_equal json, JSON.generate(data) + assert_equal data, JSON.parse(json) # json = '["\""]' data = JSON.parse(json)