JSON.load とJSON.parse の違い

RubyJSONライブラリのJSON.loadJSON.parse の違いを調べた。

結論

引数によって使い分ける。

  • JSON.load: 引数がJSONファイル
  • JSON.parse: 引数がJSON文字列

JSONファイルをRubyで読み込む

読み込み用のdata.jsonmain.rb で読み込んで出力してみます。

// data.json

{
  "memos": [
    {
      "id": 1,
      "title": "Title 1",
      "content": "Content 1"
    },
    {
      "id": 2,
      "title": "Title 2",
      "content": "Content 2"
    }
  ]
}

require 'json' を忘れないように記述。

# main.rb

require 'json'

# JSON.load
file = File.open('data.json')
use_json_load = JSON.load(file)
p use_json_load

# JSON.parse
string = File.read('data.json')
use_json_parse = JSON.parse(string)
p use_json_parse

出力結果はどちらも同じ。

$ ruby main.rb
{"memos"=>[{"id"=>1, "title"=>"Title 1", "content"=>"Content 1"}, {"id"=>2, "title"=>"Title 2", "content"=>"Content 2"}]}
{"memos"=>[{"id"=>1, "title"=>"Title 1", "content"=>"Content 1"}, {"id"=>2, "title"=>"Title 2", "content"=>"Content 2"}]}

上記の例ではJSONファイルから読み込んだデータのキーが文字列になっていますが、シンボルとして読み込みたい場合はオプションにsymbolize_names: true を追加することで可能になります。

まとめ

  • JSON.loadJSON.parse もどちらもだいたい同じことができそう。
  • symbolize_names オプションの追加の際の記述が少し異なるようで、実際の使い分けはオプション追加時に書きやすい方を選択することになりそう。

参照

module JSON (Ruby 3.1 リファレンスマニュアル)

module JSON (Ruby 3.1 リファレンスマニュアル)

JSON.parseとJSON.loadの違い - 猫の魔法

RubyでJSONを読み込む - No Solution for Life