Androidプログラミング

【Android】JSONファイルの書き込み方法【Kotlin】

androidでjsonファイル書き込み方法紹介のアイキャッチ画像 Android

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の書き込み方法について。
大まかな手順は以下の通り。

  1. JSONファイルを読み取り、JSONArrayに格納
  2. 追記分のJSON要素(JSONObject)を作成
  3. 1番のJSONArrayに、2番の追記分を追加
  4. JSONArrayをテキストに変換
  5. ファイルとして保存

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は便利なので今後もお世話になりそうです。

コメント

タイトルとURLをコピーしました