AndroidでJSONファイルを書き込む方法を紹介します。配列や入れ子構造の書き込みも扱います。
前準備:書き込み用のJSONファイル作成
今回はアプリ内部ストレージにJSONファイルを作成し、それを編集します。
(理由はassetsフォルダ内のファイルはユーザが編集できないため)
すでに編集用のJSONファイルが用意できている方は飛ばしてください。
以下記事でJSONファイル(assetsフォルダ内)の読み込み方法を紹介しています。jsonファイルを編集する必要がない(読み取り専用ファイル)場合は以下記事を推奨。
assets内JSONファイル名は「myjson.json」、編集用新JSONファイル(アプリ内部ストレージに保存)名は「newmyjson.json」。
myjson.jsonの内容は以下の通り(heightweightは配列、scoreは入れ子の構造)。
生徒の名前・身長体重・テストの点数といったイメージ。
{ "students": [ { "name": "佐藤", "no": 1, "heightweight": [170,60], "score": { "testA": 70, "testB": 80, "testC": 90 } }, { "name": "山田", "no": 2, "heightweight": [180,80], "score": { "testA": 82, "testB": 85, "testC": 87 } } ] }
Assets内JSONファイルを読み取り、ファイル保存する方法は以下の通り。
// Assets内json読み込み(テキスト形式) val assetsManager = resources.assets val inputStream = assetsManager.open("myjson.json") val bufferedReader = BufferedReader(InputStreamReader(inputStream)) val jsonStr = bufferedReader.readText() val jsonObj = JSONObject(jsonStr) // 新jsonファイルの作成 val newjsonFilenameinAppStoroge = "newmyjson.json" val newjsonFileinAppStorage = File(applicationContext.filesDir, newjsonFilenameinAppStoroge) // 新jsonファイルに内容(jsonObj)を記述 newjsonFileinAppStorage.writer().use{ it.write(jsonObj.toString()) }
これで編集用のJSONファイルが作成できました。
jsonファイルに書き込む方法(配列,入れ子構造含む)
AndroidでJSONを書き込むためには、Gsonというライブラリを使用します。
Gsonを使用するために、build.gradle(:app)に以下の追記をします。
dependencies { /** 省略 **/ // ↓以下を追記 implementation 'com.google.code.gson:gson:2.9.0' }
KotlinでGsonを使用するために以下インポートを記載します。
import com.google.gson.Gson
で本題のJSONの書き込み方法について。
大まかな手順は以下の通り。
- JSONファイルを読み取り、JSONArrayに格納
- 追記分のJSON要素(JSONObject)を作成
- 1番のJSONArrayに、2番の追記分を追加
- JSONArrayをテキストに変換
- ファイルとして保存
Kotlinのコードは以下の通り。
(15行で追記するデータの要素は各自で変更してください)
// ① JSONファイル読み取り + JSONArrayに格納 ------------------------------- newjsonFileinAppStorage = File(applicationContext.filesDir, newjsonFilenameinAppStoroge) // ファイル読み取り var jsonstr:String = "" BufferedReader(FileReader(newjsonFileinAppStorage)).use{ br -> jsonstr = br.readLine() } // 変数に保存済みjsonファイルの内容を代入 var jsonObj = JSONObject(jsonstr) var jsonArray = jsonObj.getJSONArray("students") // ② 追記分のJSON要素(JSONObject)を作成 ------------------------------- var gson = Gson() val newele = gson.toJson(NewElement("高橋",3, arrayListOf(200,53), Scores(10,20,30))) var element:JSONObject = JSONObject(newele) // ③ 追記分をjsonArrayに追加 ------------------------------- jsonArray.put(element) // ④ jsonArrayをテキストに変換する(+大元のkey:studentsの元に配置) ----------- val elements = jsonArray.toString() val jsontext = """{"students": ${elements} }""" // ⑤ ファイルとして保存 ------------------------------- newjsonFileinAppStorage.writer().use{ it.write(jsontext) }
追記する要素はdata classを用いて定義します。今回は以下の通り。
data class NewElement( val name: String, val no: Int, val heightweight: ArrayList<Int>, val score:Scores ) // 入れ子構造用data class data class Scores( val testA:Int, val testB:Int, val testC:Int )
配列の場合はArrayList<>、入れ子構造の場合はさらに別のdata classを利用します。
同じ型のデータを複数入れるだけなら配列、key名が欲しい場合・様々な方が混在する場合は入れ子構造になります。
さいごに
AndroidでJSONを記載する方法を紹介しました。配列を記載する方法(ArrayList<>を使うこと)が分からず時間がかかりました。
JSONは便利なので今後もお世話になりそうです。
コメント