这是预期的行为吗?注意换行符如何丢失。
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"}
我正在使用rails 3.0.3。
答案 0 :(得分:2)
似乎这是ActiveSupport中的一个错误,将在Rails 3.0.5中修复。现在我有patched activesupport,事情正在按预期进行。
ruby-1.9.2-p136 :001 > ActiveSupport::JSON.decode("{\"content\": \"active\n\nsupport\"}")
=> {"content"=>"active\n\nsupport"}
答案 1 :(得分: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
)。通过安装json
gem并将JSON后端更改为ActiveSupport::JSON.backend = 'JSONGem'
)并尝试解码相同的文本(ActiveSupport::JSON.decode("{\"content\": \"active\\n\\nsupport\"}")
),您将获得以下内容:
JSON::ParserError: 737: unexpected token at '{"content": "active
support"}'