猫の魔法

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

JSON.parseとJSON.loadの違い

JSON.parseとJSON.loadの差が何なのか分からなかったので調べてみた。

※下記の参考のStackOverflowの内容がその答えだが、裏を取りたかった。

require 'json'

File.open("hoge.json") do |f|
  JSON.parse(f.read) == File.open("hoge.json"){ |f| JSON.load(f) } ? p("same") : p("diffrent")
end
=> "same"

※File.openを2回呼んでいるのはどげんかせんといかん。

Ruby公式ドキュメント:parse:loadを見ると、parseはparamのsourceがJSONの文字列しか受け付けないのに対して、 loadはto_str,to_io, readを持つオブジェクトもparamのsourceに指定可能と記載されている。

githubJSON.loadの実装を見ると、loadがparseをラップしているのが分かる。

今回のようにファイルから読み込む場合、parseはreadから返された文字列が、loadはFile.to_io.readで返された文字列が使われる為、両方供同じようにfileからJSONファイルを読み込める形になるようだ。

loadはドキュメントの通り、loadに渡されたオブジェクトがto_str,to_io,readのどれかを返せばいいので、 String以外のオブジェクトからparseを呼び出す際は、loadを使用する形になるのではないかと思う。

参考

StackOverflow:What’s the difference between JSON.load and JSON.parse methods of Ruby lib?