JSON.parseのquirks_modeと2.4.0での変更
どんだけJSONネタで引っ張るのかという話もあるが、色々と調べて見て分かった事があったのでブログに記録しておく。
JSON.parseでは:quirks_modeというオプションがある。
通常JSONを解析する場合、そのトップレベルはオブジェクト若しくは配列になっている必要があるはずだが、 このオプションが真のときは単一のパラメータを解釈してくれる。
irb(main):001:0>require 'json' => true irb(main):002:0>JSON.parse("12",{:quirks_mode=>true}) => 12 irb(main):003:0>JSON.parse("12",{:quirks_mode=>false}) JSON::ParserError: 784: unexpected token at '12' from /Users/nekomaho/.rbenv/versions/2.3.1/lib/ruby/2.3.0/json/common.rb:156:in `parse' from /Users/nekomaho/.rbenv/versions/2.3.1/lib/ruby/2.3.0/json/common.rb:156:in `parse' from (irb):9 from /Users/nekomaho/.rbenv/versions/2.3.1/bin/irb:11:in `<main>' irb(main):004:0> JSON.load(nil,nil,{:quirks_mode=>true}) => nil irb(main):005:0> JSON.load(nil,nil,{:quirks_mode=>false}) TypeError: no implicit conversion of nil into String from /Users/nekomaho/.rbenv/versions/2.3.1/lib/ruby/2.3.0/json/common.rb:156:in `initialize' from /Users/nekomaho/.rbenv/versions/2.3.1/lib/ruby/2.3.0/json/common.rb:156:in `new' from /Users/nekomaho/.rbenv/versions/2.3.1/lib/ruby/2.3.0/json/common.rb:156:in `parse' from /Users/nekomaho/.rbenv/versions/2.3.1/lib/ruby/2.3.0/json/common.rb:335:in `load' from (irb):4 from /Users/nekomaho/.rbenv/versions/2.3.1/bin/irb:11:in `<main>'
このオプション、ruby 2.4.0から廃止され:allow_blankというオプションになっている。
正確には、nil以外の単一のパラメータを解釈するのがデフォルトの挙動となり、 :allow_blankで"nil"を受けるかどうかのみ変更出来るようになったというのが正しい。
irb(main):001:0>require 'json' => true irb(main):002:0> JSON.load(nil,nil,{:allow_blank=>true}) => nil irb(main):003:0> JSON.load(nil,nil,{:allow_blank=>false}) TypeError: no implicit conversion of nil into String from /Users/nekomaho/.rbenv/versions/2.4.0/lib/ruby/2.4.0/json/common.rb:156:in `initialize' from /Users/nekomaho/.rbenv/versions/2.4.0/lib/ruby/2.4.0/json/common.rb:156:in `new' from /Users/nekomaho/.rbenv/versions/2.4.0/lib/ruby/2.4.0/json/common.rb:156:in `parse' from /Users/nekomaho/.rbenv/versions/2.4.0/lib/ruby/2.4.0/json/common.rb:335:in `load' from (irb):15 from /Users/nekomaho/.rbenv/versions/2.4.0/bin/irb:11:in `<main>'
という指摘も出ていて、本当にこの変更がそのまま2.4系に適用されるのかは怪しい。