diff --git a/lib/json_builder/extensions.rb b/lib/json_builder/extensions.rb index c6d3ebc..1e94a20 100644 --- a/lib/json_builder/extensions.rb +++ b/lib/json_builder/extensions.rb @@ -13,6 +13,16 @@ def to_builder end class String + JS_ESCAPE_MAP = { + '\\' => '\\\\', + ' '<\/', + "\r\n" => '\n', + "\n" => '\n', + "\r" => '\n', + '"' => '\\"', + "'" => "\\'" + } + def to_builder %("#{json_escape}") end @@ -20,10 +30,9 @@ def to_builder private def json_escape - self.gsub(/\n/, '\\n'). - gsub(/\r/, '\\r'). - gsub(/\t/, '\\t'). - gsub(/\f/, '\\f') + gsub(/(\\|<\/|\r\n|\342\200\250|\342\200\251|[\n\r"'])/u) { |match| + JS_ESCAPE_MAP[match] + } end end diff --git a/test/member_test.rb b/test/member_test.rb index b774912..2c2b0f6 100644 --- a/test/member_test.rb +++ b/test/member_test.rb @@ -39,6 +39,10 @@ def test_custom_class assert_equal '"hello": "olleh"', member('hello', Dozer.new('hello')).to_s end + def test_double_quoted_value + assert_equal '"hello": "\"Hello\" he said"', member('hello', '"Hello" he said').to_s + end + def test_without_key assert_raises(JSONBuilder::MissingKeyError) { member(nil, true).to_s } end diff --git a/test/value_test.rb b/test/value_test.rb index 1374d3b..ee3429a 100644 --- a/test/value_test.rb +++ b/test/value_test.rb @@ -64,4 +64,8 @@ def test_hash_value def test_custom_class assert_equal '"olleh"', value(Dozer.new('hello')) end + + def test_double_quoted_value + assert_equal '"\"hello\""', value('"hello"') + end end