[Android]JSONで多重配列を使う(Kotlin)
ググった感じ、やり方はあるにはありそうだったけど、わざわざパース用のクラスを定義するとか複雑だったり、自分の環境ではうまく動かなかったり、なかなかピンと来る方法が見つからなかった。
そもそもAndroidのライブラリそのままでは、値としての多次元配列を一発でパースすることができないっぽい。
そういうのをパースしたければgetJSONArrayを繰り返して使うか、外部ライブラリ使ってくれって感じだった。
PythonだとJSONがいくらネストしてようが簡単にパースできるんだけどなぁ。
KotlinでもPythonみたいにラク~にできるようになるといいんだけどなぁ。
最終的にGsonを使う方法に落ち着いた。
これならシンプルだし、わざわざ先にパース用のクラスを定義したりする必要がない。
Gsonを使うためには、モジュールのbuild.gradleに以下の記述を追加する。
1 | implementation 'com.google.code.gson:gson:2.8.6' |
コード例は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val content = """ { "TEST": ["AA", "BB", "CC"], "NEST_TEST": [ ["A1", "A2", "A3"], ["B1", "B2", "B3"], ["C1", "C2", "C3"] ] } """.trimIndent() val gson = Gson() val json = JSONObject(content) // Parse a non-nested array without Gson val testList: JSONArray = json.getJSONArray("TEST") Log.d("test", "testList: $testList") // ArrayListと似ている?ので、contentToStringはいらない // Parse a non-nested array with Gson val test2 = json.getString("TEST") val testList2: Array<String> = gson.fromJson( test2, Array<String>::class.java ) Log.d("test", "testList2: ${testList2.contentToString()}") // Parse a nested array val nestTest: String = json.getString("NEST_TEST") val nestTestList: Array<Array<String>> = gson.fromJson( nestTest, Array<Array<String>>::class.java ) for((i, t) in nestTestList.withIndex()) { Log.d("test", "nestTestList[$i]: ${t.contentToString()}") } } } |
1 2 3 4 5 | D/test: testList: ["AA","BB","CC"] D/test: testList2: [AA, BB, CC] D/test: nestTestList[0]: [A1, A2, A3] D/test: nestTestList[1]: [B1, B2, B3] D/test: nestTestList[2]: [C1, C2, C3] |
この記事へのコメントはこちら