JSONは外部のAPIや他システムと連携する際のデータフォーマットとしてよく用いられるフォーマットです。
プログラム内では受け取ったJSONデータをシステム内に取り込んだり、その逆を行ったりすることがあるため、JSONデータの操作が必要となります。
本記事では、RubyにおけるJSONデータの操作についてまとめます。
プログラミング初心者の方の学習や、忘れてしまった方の復習として、参考にしていただければ幸いです。
記載しているプログラムは、Ruby2.7.1を使って動作確認をしています。
RubyのJSON操作
RubyのJSON操作として以下の内容を採り上げます。
- JSONを扱うモジュール
- JSONファイルの読み込み
- JSONデータの参照
- JSONデータの追加
- JSONデータの削除
- 文字列からJSONオブジェクトへの変換
- JSONオブジェクトから文字列への変換
JSONを扱うモジュール
RubyでJSONデータを扱うには、標準ライブラリの json モジュールを使います。
以下のように、require が必要となります。
require 'json'
JSONファイルの読み込み
本記事では、以下のJSONデータを扱います。
{ "string": "文字列", "int": 2020, "bool": true, "null": null, "array": [ {"no": 1, "name": "JavaScript"}, {"no": 2, "name": "Python"} ], "object": { "no": 3, "name": "Java" } }
この内容を data.json というファイルで保存し、プログラムから読み込みます。
ファイルから読み込む際に、JSON.load を使うことでJSONオブジェクトに変換します。
Rubyではhashと配列でJSONオブジェクトを扱います。
File.open("./data.json", "r") do |file| json = JSON.load(file) puts json # -> (上記のJSONファイルの内容が1行で表示される) end
JSONデータの参照
JSONオブジェクトのデータを参照するには、hashと配列の参照の仕方と同じになります。
文字列や整数の参照は、直接キー名を指定して値を取得します。
puts json["string"] # -> 文字列 puts json["int"] # -> 2020 puts json["bool"] # -> True puts json["null"] # -> None
配列の参照は、キー名にインデックスを指定して値を取得します。
puts json["array"][0]["no"] # -> 1 puts json["array"][0]["name"] # -> JavaScript puts json["array"][1]["no"] # -> 2 puts json["array"][1]["name"] # -> Python
配列なので、ループによる参照も可能です。
json["array"].each do |a| puts a["no"] # -> 1 -> 2 puts a["name"] # -> JavaScript -> Python end
オブジェクトの参照は、ネストするオブジェクトのキー名を参照して値を取得することができます。
puts json["object"]["no"] # -> 3 puts json["object"]["name"] # -> Java
JSONデータの追加
JSONオブジェクトにデータを追加するには、hashや配列への追加の仕方と同じになります。
文字列や整数値の追加は、jsonオブジェクトに直接キーと値を指定します。
json["string2"] = "文字列2" json["int2"] = 2021 json["bool2"] = false json["null2"] = nil
配列に追加するには、pushを使って追加するJSONを指定します。
json["array"].push({"no"=>4, "name"=>"Ruby"})
オブジェクトを追加するには、オブジェクトをネストさせてキーと値を指定します。
json["object"]["object2"] = {"no"=>5, "name"=>"Go"}
上記で追加したJSONオブジェクト全体を表示させると以下のようになります。
{ "string": "文字列", "int": 2020, "bool": true, "null": null, "array": [ { "no": 1, "name": "JavaScript" }, { "no": 2, "name": "Python" }, { "no": 4, "name": "Ruby" } ], "object": { "no": 3, "name": "Java", "object2": { "no": 5, "name": "Go" } }, "string2": "文字列2", "int2": 2021, "bool2": false, "null2": null }
JSONデータの削除
JSONオブジェクトからデータを削除するには、hashや配列の削除方法と同じになります。
json.delete("string2") json.delete("int2") json.delete("bool2") json.delete("null2") json["array"].delete_at(2) json["object"].delete("object2")
上記で削除した結果のJSONオブジェクト全体を表示させると以下のようになります。
(追加した分が削除されて、元の状態に戻っています)
{ "string": "文字列", "int": 2020, "bool": true, "null": null, "array": [ { "no": 1, "name": "JavaScript" }, { "no": 2, "name": "Python" } ], "object": { "no": 3, "name": "Java" } }
文字列からJSONオブジェクトへの変換
文字列からJSONオブジェクトへ変換するには、JSON.parse を使います。
s = "{\"text\": \"テキスト\", \"num\": 1}" j = JSON.parse(s) puts j # -> {"text"=>"テキスト", "num"=>1}
JSONオブジェクトから文字列への変換
JSONオブジェクトから文字列へ変換するには、JSON.dump または JSON.generate を使います。
JSON.dumpにはファイルハンドルを指定することができるので、ファイルへ出力することが可能です。
JSON.generateには文字列にする際の形式についてオプションで指定することが可能です。
puts JSON.dump(j) # -> {"text":"テキスト","num":1} puts JSON.generate(j) # -> {"text":"テキスト","num":1}
改行も入れて整形した文字列へ変換するには、JSON.pretty_generate を使います。
puts JSON.pretty_generate(j)
上記のプログラムを実行すると、以下のように表示されます。
{ "text": "テキスト", "num": 1 }
JSONデータを自由に扱えるようになろう
最近では、JSON形式のデータをプログラム内だけではなく、ログやインフラ等の設定情報、保存用データなど様々な部分で使われることが増えてきました。
プログラマブルなデータフォーマットとして保存することで、プログラムで自由に解析をしやすくする意図があります。
ちょっとしたJSON解析プログラムを作ることで、今までExcelで集計していた業務を効率化することが出来たり、プログラムによってチェックすることで作業ミスを防止することも出来ます。
こうした日頃の作業をプログラマブルに出来ないか考えてみるのも良いと思います。
今回はRubyのJSON操作についてまとめました。
以上、参考になれば幸いです。
コメント