mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fix JSON decoder with nested quotes and commas. Closes #9579.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7506 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
6b68b215c2
commit
71e33d9650
3 changed files with 13 additions and 4 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Fix JSON decoder with nested quotes and commas. #9579 [zdennis]
|
||||
|
||||
* Hash#to_xml doesn't double-unescape. #8806 [Ezran]
|
||||
|
||||
* Added Array#rand #9170 [norbert]. Examples:
|
||||
|
|
|
@ -15,19 +15,24 @@ module ActiveSupport
|
|||
end
|
||||
|
||||
protected
|
||||
|
||||
# Ensure that ":" and "," are always followed by a space
|
||||
def convert_json_to_yaml(json) #:nodoc:
|
||||
scanner, quoting, marks = StringScanner.new(json), false, []
|
||||
|
||||
while scanner.scan_until(/(['":,]|\\.)/)
|
||||
while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/)
|
||||
case char = scanner[1]
|
||||
when '"', "'"
|
||||
quoting = quoting == char ? false : char
|
||||
when ":", ","
|
||||
if !quoting
|
||||
quoting = char
|
||||
elsif quoting == char
|
||||
quoting = false
|
||||
end
|
||||
when ":",","
|
||||
marks << scanner.pos - 1 unless quoting
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if marks.empty?
|
||||
json
|
||||
else
|
||||
|
|
|
@ -8,6 +8,8 @@ class TestJSONDecoding < Test::Unit::TestCase
|
|||
%({"returnTo":{"/categories":1}}) => {"returnTo" => {"/categories" => 1}},
|
||||
%({"returnTo":[1,"a"]}) => {"returnTo" => [1, "a"]},
|
||||
%({"returnTo":[1,"\\"a\\",", "b"]}) => {"returnTo" => [1, "\"a\",", "b"]},
|
||||
%({a: "'", "b": "5,000"}) => {"a" => "'", "b" => "5,000"},
|
||||
%({a: "a's, b's and c's", "b": "5,000"}) => {"a" => "a's, b's and c's", "b" => "5,000"},
|
||||
%([]) => [],
|
||||
%({}) => {},
|
||||
%(1) => 1,
|
||||
|
|
Loading…
Reference in a new issue