RubyでJSONファイルを更新する

JSONファイルを更新するには、全てを読み込んで更新したデータを丸ごと上書きすることになる。追記や削除、一部変更というのはできない。

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

JSONファイルの更新手順

  1. JSONファイルをロードしてJSONオブジェクト全体をRubyオブジェクトに変換する
  2. Rubyオブジェクトを更新する
  3. 更新した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"

# JSONオブジェクトをRubyオブジェクトに変換して名前をつける
hash = File.open("project.json") { |f| JSON.load(f) } 

# projectNameを変更
hash["projectName"] = "Third Project"  

# membersの配列に要素を追加
hash["members"] << {"staffId"=>12, "name"=>"Dave Go", "age"=>45}

# membersの配列の2つ目の要素を削除
hash["members"].delete_at(1)

# 更新したhashをJSONオブジェクトに変換して書き込む
File.open("project.json", "w") { |f| JSON.dump(hash, f) }

# 更新後のhashの中身を確認
p hash
#=> {"projectId"=>3, "projectName"=>"Third Project", "leader"=>{"staffId"=>1, "name"=>"Chris Json", "age"=>35}, "members"=>[{"staffId"=>10, "name"=>"Alice Ruby", "age"=>30}, {"staffId"=>12, "name"=>"Dave Go", "age"=>45}]}

File.openにブロックを渡すとブロックの実行結果が返るので、それを変数hashに代入。hashでなくて好きな名前をつけてOK。

hashにはJSONオブジェクトをRubyオブジェクトに変換したものが入っているので、Rubyのハッシュや配列と同じように操作してデータを更新する。JSONのプロパティ名は必ず文字列なので、"を忘れないように。

更新したhashJSON.dumpJSONオブジェクトに変換して書き込む。

JSONオブジェクトはRubyで直接操作できない、というところがポイント。

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

File.new (Ruby 2.7.0 リファレンスマニュアル)

(参考)RubyでJSONファイルを読み込んで更新して保存するサンプルスクリプト - Qiita