RubyでJSONを読み込む

JSONの構造についてはこちらの記事

JSONファイルをRubyで読み込むには、JSONライブラリをrequireした上でJSON.load("filename")を使う。

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

RubyJSONファイルを読み込む

<project.json>

{
    "projectId": 3,
    "projectName": "Practice project",
    "leader": {
        "staffId": 1,
        "name": "Chris Json",
        "age": 35
    },
    "members": [
        {
            "staffId": 10,
            "name": "Alice Ruby",
            "age": 30
        },
        {
            "staffId": 11,
            "name": "Bob Java",
            "age": 40
        }
    ]
}

<test.rb>

require "json"

File.open("project.json") do |f|
  data = JSON.load(f)
  p data
end

ファイルをopenして、そのJSONファイルをload、つまりRubyで扱える形に変換して、json_dataという変数に格納。pメソッドでロードした内容を表示してみる。

test.rb をターミナルで実行

$ ruby test.rb 
{"projectId"=>3, "projectName"=>"Practice project", "leader"=>{"staffId"=>1, "name"=>"Chris Json", "age"=>35}, "members"=>[{"staffId"=>10, "name"=>"Alice Ruby", "age"=>30}, {"staffId"=>11, "name"=>"Bob Java", "age"=>40}]}

このように、JSONオブジェクトがRubyのハッシュや配列に変換された。コロン:=>に変わっている!

これで、Rubyオブジェクトとして値を取り出したり内容を変更したりすることができるようになる。

値を取り出す

Rubyオブジェクトなので、Rubyと同じように操作できる。例としていくつか値を取得してみる。

<test.rb> projectName を取得

File.open("project.json") do |f|
  data = JSON.load(f)
  p data["projectName"] #=> "Practice project"
end

<test.rb> leader の staffId を取得

File.open("project.json") do |f|
  data = JSON.load(f)
  p data["leader"]["staffId"] #=> 1
end

<test.rb> 1人目のメンバーの名前を取得

File.open("project.json") do |f|
  data = JSON.load(f)
  p data["members"][0]["name"] #=> "Alice Ruby"
end

ファイルではなくJSON文字列の場合

JSONファイルではなくJSON形式の文字列を直接引数にする場合は、loadではなくparseメソッドを使う。

str = '{"projectId":3, "projectName":"Practice project", "leader":{"staffId":1, "name":"Chris Json", "age":35}, "members":[{"staffId":10, "name":"Alice Ruby", "age":30}, {"staffId":11, "name":"Bob Java", "age":40}]}'
data = JSON.parse(str)
p data["projectName"] #=> "Practice project"

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

ruby - JSON.load と JSON.parse の違いは何ですか? - スタック・オーバーフロー

(6/16追記)普通にファイルを読み込んだらだめなのか

JSONオブジェクトは、見た目がRubyのキーをシンボルにしたハッシュオブジェクトによく似ている。JSONクラスを使わずに普通にJSONファイルを読み込んだらどうなるか試してみた。

<test2.rb>

require "json"

File.open("project.json") do |f|
  data = f.read
  p data
end
$ ruby test2.rb
"{\n    \"projectId\": 3,\n    \"projectName\": \"Practice project\",\n    \"leader\": {\n        \"staffId\": 1,\n        \"name\": \"Chris Json\",\n        \"age\": 35\n    },\n    \"members\": [\n        {\n            \"staffId\": 10,\n            \"name\": \"Alice Ruby\",\n            \"age\": 30\n        },\n        {\n            \"staffId\": 11,\n            \"name\": \"Bob Java\",\n            \"age\": 40\n        }\n    ]\n}\n"

このように、Rubyオブジェクトとしてはただの文字列になってしまう。JSONオブジェクトはハッシュオブジェクトと見た目は似ているが全く別物だということに注意。