2

这是预期的行为吗?注意换行符是如何丢失的。

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。

4

2 回答 2

2

我最终遇到了这张票: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"}
于 2011-02-23T17:29:19.580 回答
1

要使用双引号表示 JSON 数据中的换行符,您必须转义换行符:

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

否则,您将在 JSON源中插入换行符,而不是在 JSON数据中。请注意,这也可以:

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

通过使用单引号,您不再需要在 JSON 源中插入文字换行符。

有趣的是 ActiveSupport 默认处理这个的方式(默认的 JSON 后端是ActiveSupport::JSON::Backends::Yaml)。通过安装jsongem 并将 JSON 后端更改为它 ( ActiveSupport::JSON.backend = 'JSONGem') 并尝试解码相同的文本 ( ActiveSupport::JSON.decode("{\"content\": \"active\\n\\nsupport\"}")),您将获得以下信息:

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

support"}'
于 2011-02-23T03:42:51.090 回答