ActiveSupport :: JSON.decode неправильно обрабатывает литеральные разрывы строк - PullRequest
2 голосов
/ 22 февраля 2011

Это ожидаемое поведение?Обратите внимание на то, как теряется символ разрыва строки.

ruby-1.9.2-p136 :001 > ActiveSupport::JSON.decode("{\"content\": \"active\n\nsupport\"}")
 => {"content"=>"active\nsupport"}

То же самое происходит с разрывами строк в кодировке Unicode:

ruby-1.9.2-p136 :002 > ActiveSupport::JSON.decode("{\"content\": \"active\u000a\u000asupport\"}")
 => {"content"=>"active\nsupport"}

Я использую рельсы 3.0.3.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Я в итоге наткнулся на этот билет: https://rails.lighthouseapp.com/projects/8994/tickets/3479-activesupportjson-fails-to-decode-unicode-escaped-newline-and-literal-newlines

Кажется, это ошибка в ActiveSupport, которая будет исправлена ​​в Rails 3.0.5. На данный момент у меня есть пропатчен activesupport и все работает, как ожидалось.

ruby-1.9.2-p136 :001 > ActiveSupport::JSON.decode("{\"content\": \"active\n\nsupport\"}")
 => {"content"=>"active\n\nsupport"}
1 голос
/ 23 февраля 2011

Чтобы представить новую строку в данных JSON с помощью двойных кавычек, вы должны экранировать новую строку:

ActiveSupport::JSON.decode("{\"content\": \"active\\n\\nsupport\"}")

В противном случае вы вставляете новую строку в источник JSON , а не в JSON данные .Обратите внимание, что это также будет работать:

ActiveSupport::JSON.decode('{"content": "active\n\nsupport"}')

Используя одинарные кавычки, вы больше не вставляете буквальный символ новой строки в источник JSON.

ЭтоИнтересно отметить, как ActiveSupport обрабатывает это по умолчанию (бэкэнд по умолчанию JSON ActiveSupport::JSON::Backends::Yaml).Установив гем json и изменив на него бэкэнд JSON (ActiveSupport::JSON.backend = 'JSONGem') и попытавшись декодировать тот же текст (ActiveSupport::JSON.decode("{\"content\": \"active\\n\\nsupport\"}")), вы получите следующее:

JSON::ParserError: 737: unexpected token at '{"content": "active

support"}'
...