JSONファイルを更新するには、全てを読み込んで更新したデータを丸ごと上書きすることになる。追記や削除、一部変更というのはできない。
JSONの構造についてはこちらの記事。
JSONの読み込みについてはこちらの記事。
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のプロパティ名は必ず文字列なので、"
を忘れないように。
更新したhash
をJSON.dump
でJSONオブジェクトに変換して書き込む。
JSONオブジェクトはRubyで直接操作できない、というところがポイント。
JSON.#dump (Ruby 2.7.0 リファレンスマニュアル)