JSONファイルをRubyで読み込むには、JSONライブラリをrequire
した上でJSON.load("filename")
を使う。
JSON.#load (Ruby 2.7.0 リファレンスマニュアル)
RubyでJSONファイルを読み込む
<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オブジェクトはハッシュオブジェクトと見た目は似ているが全く別物だということに注意。