概要
出力される JSON に含まれる文字の一部が、JavaScript の Unicode エスケープシーケンス に変換されているかされていないかが異なる。
Rails 側は、どういう仕様なんだろう?と思いました。
ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]
irb
irb(main):001:0> require 'json'
=> true
irb(main):002:0> "<".to_json
=> "\"<\""
irb(main):003:0> { "<" => "<" }.to_json
=> "{\"<\":\"<\"}"
bundle exec rails --version
Rails 4.2.7
bundle exec rails console
[1] pry(main)> "<".to_json
=> "\"\\u003c\""
[2] pry(main)> { "<" => "<" }.to_json
=> "{\"\\u003c\":\"\\u003c\"}"
結論
仕様だった。
# Rails does more escaping than the JSON gem natively does (we
# escape \u2028 and \u2029 and optionally >, <, & to work around
# certain browser problems).
ESCAPED_CHARS = {
"\u2028" => '\u2028',
"\u2029" => '\u2029',
'>' => '\u003e',
'<' => '\u003c',
'&' => '\u0026',
}
なお、引数で処理を変えれる よう。
補足) 何故調べたのか
HTML 内にある script タグに </script>
が書かれると JS が壊れる 問題がふと気になって、Rails でテンプレート上で to_json
した場合に大丈夫なのかな?というのを調べたからです。
ちゃんとしていました。