読者です 読者をやめる 読者になる 読者になる

猫の魔法

主にruby系の技術メモを記載

JSON.parseのquirks_modeと2.4.0での変更

Ruby

どんだけ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>'

ただ、 Parsing JSON with `quirks_mode: false` parses as if it is `true` and does not warn me. · Issue #309 · flori/json · GitHub

という指摘も出ていて、本当にこの変更がそのまま2.4系に適用されるのかは怪しい。

関連

nekomaho.hatenablog.jp nekomaho.hatenablog.jp