JSONファイルから取得したハッシュのキーをシンボルにする

JSONファイルから取得したハッシュのキーがデフォルトで文字列だったのでシンボルにしたい。

結論

  • JSON.loadJSON.parse 共にsymbolize_names オプションをtrue にする
  • JSON.load のみ追加でprocnilcreate_additions オプションをfalse にする

JSONファイルから読み込んだハッシュのキーをシンボルにする

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

// data.json

{
  "memos": [
    {
      "id": 1,
      "title": "Title 1",
      "content": "Content 1"
    },
    {
      "id": 2,
      "title": "Title 2",
      "content": "Content 2"
    }
  ]
}
  • require 'json'JSONモジュールを読み込み
  • JSON.loadJSON.parse のオプションにsymbolize_names: true を追加
  • JSON.load の場合はsymbolize_names オプション追加時にはproccreate_additions の指定も必須
# main.rb

require 'json'

# JSON.load
file = File.open('data.json')
use_json_load = JSON.load(file, nil, create_additions: false, symbolize_names: true)
p use_json_load

# JSON.parse
string = File.read('data.json')
use_json_parse = JSON.parse(string, symbolize_names: true)
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.loadJSON.parse のオプションの違いに気付けなかったので理解までちょっと時間が掛かってしまいました。 JSONファイルを読み込みハッシュとしてデータを扱う場合はおそらく文字列よりもシンボルの方が使いやすいと思うので記述の短いJSON.parse を使った方が良いかもしれません。

参照

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

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

JSONファイルの値を取り出したい。(おまけ:binding.irbの使い方 | FJORD BOOT CAMP(フィヨルドブートキャンプ)