なぜ作った
Firebase の RealtimeDatabase をバックアップデータから復元したい時がありました。
Blazeプランにしていれば、バックアップデータは毎日自動的に取っておいてくれます。
これを取って来て、さあ目的のjson部分を取り出そう…と思ったらこれが大変。
ファイルは巨大だし、中身は改行もなくとんでもない長い1行になっていて、データの確認するのも一苦労…
というわけで作ったスクリプト(Ruby)。
スクリプト
#!/usr/bin/ruby
# coding: utf-8
require "json"
if ARGV[0] == "-h" then
puts <<-EOS
# 使い方
#
# ruby json_extraction.rb XXX.json path/to/json/data >> output.json
#
# 第1引数
# jsonファイル
#
# 第2引数
# path/to/json/data で、欲しいjsonデータをパス形式で指定
# ex: user/12345/save/GameManager
# 配列の場合も、インデックスをそのまま書けばOK
# ex: common/data_list/0/name
#
# 出力もjson形式。そのままGoogleRealtimeDatabaseにインポートできる形式
#
EOS
exit
end
# ファイル名
input_file_name = ARGV[0]
# 抽出パス
extraction_path = ARGV[1]
if input_file_name.nil? || extraction_path.nil?
puts "引数が足りません (-h でヘルプ)"
exit
end
# utf-8形式に変換(念のため)
`nkf -w --overwrite #{input_file_name}`
# JSONデータ
open(input_file_name) do |io|
all_json = JSON.load io
json = all_json
extraction_path.split("/").each do |key|
key = key.to_i if json.is_a? Array
json = json[key]
end
puts JSON.pretty_generate json
end
使い方
スクリプト内に書いてある通り。
パスみたいな書き方指定にしてるのは、RealtimeDatabaseの流儀?に揃えたため。