Android開発にてJSONを扱ってた時
次みたいなことを実現したかったです。
- 配列を表すJSON文字列がある
- それを配列(List)に変換したい
このように書くと簡単にできそうですが、
Java・Kotlinでは少しだけ工夫が必要です。
そこで自分自身の記憶の整理として、
AndroidでJSONパース⇒配列変換の方法をまとめます。
このページの目次
方法1.JSONArrayを使うのが一番簡単かも
真っ先に思いついたのがJSONArrayを使うこと
これは文字通りJSONを配列で解析できる奴です。
▼ このようなコードでJSON解析できる
1 2 3 4 5 6 7 8 9 |
val jsonArray = JSONArray(""" [ "Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread" ] """) |
ただしこのままだとJSONArrayとして参照することになり、配列として扱うには不便です。(要素の追加・削除などがLIstにくらべて制限される)
JSON⇒JSONArray⇒配列(List)に変換(デコード)
そこで配列化≒List化してみます。
▼ JSONArrayをmutable配列に変換する
1 2 3 4 5 |
/// mutableListに変換する val list = mutableListOf<String>() for (i in 0 until jsonArray.length()) { list.add(jsonArray.getString(i)) } |
配列化するのは少し面倒かもしれません。
もっといい方法がないか模索中
配列(List)⇒JSONArray⇒JSONに変換(エンコード)
逆に配列⇒JSONArray⇒JSONにする方法について
▼ このようなコードで実現できる
1 2 3 4 5 6 7 8 9 |
val list = listOf "Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread" ) val jsonArray = JSONArray(list) val json = jsonArray.toString() |
これで文字列として配列をシリアライズできました。
配列をストレージに保存するのに便利です。
方法2.Kotlin serialization JSON ライブラリを使う
お次はKotlin限定のライブラリを使う方法
「Kotlin serialization JSON」
これを使うと簡単にJSON⇒配列へのパース、
配列⇒JSONへのエンコードができるようになります。
まずbuild.gradleにライブラリを追加する
導入するためにbuild.gradleを開きます。
開くのはモジュールレベルの方です。
▼ そこに以下ライブラリを追加
1 2 |
/// Kotlin serialization JSON implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2" |
現時点の最新バージョンは1.3.2
あとは Sync now を押して同期します。
これを使ってJSON⇔配列の変換をしてみる
使い方はとても簡単です。
- JSON⇒配列/Listにパースするとき
パースするときは Json.decodeFromString() を使う
- 配列/List⇒JSONにエンコードするとき
JSON文字列化するには Json.encodeToString() を使う
この2つのメソッドが対になってる感じ
Android開発での実用的なコードを考えてみます。
例えばSharedPreferencesに配列を保存したいとき…
配列・Listを直接保存なんてできません。
だからJSONとしてシリアライズ化して保存します。
▼ ものすごく簡略化したコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
val prefs = getSharedPreferences("myapp", MODE_PRIVATE) /// 配列としてからPreferencesから読込 val colors = Json.decodeFromString<MutableList<String>>( prefs.getString("colors_json", """ ["red", "green"] """) ) /// 配列に1つの要素を追加する colors.add("blue") /// シリアライズ化してPreferencesに保存 prefs.edit().putString( "colors_json", Json.encodeToString(colors) ).apply() |
Androidでアプリ設定を保存するとき……SharedPreferencesが使えるけど配列・ArrayListを保存できなのが超不便です。
似た機能として putStringSet() というメソッドもあるけど、これはSet<String>を保存するためであり Listのように要素オーダーは保持しません
だからJSONを使う必要があったわけですね。
同じことはJSONArrayを使ってもできます。
JSONArrayの方法よりライブラリ使う方が楽
どっちを使うかは状況次第ですね。
- JSONArrayを使うと余計なライブラリは必要なし
- でもJSON⇒JSONArray⇒配列という冗長さあり
その点ライブラリを使うと一発で変換ができます。
JSONArrayはライブラリの導入コストを嫌う人、
余計なライブラリを増やしたくない人向けですね。
JSON⇔配列に変換する方法のまとめ
ということで紹介した方法のまとめ
- JSONArrayを使ってJSON変換する
ライブラリなどを導入しなくても使えるからお手軽。ただしエンコード・デコードにはそれなりの工夫が必要になるから少し面倒かもしれない。
- Kotlin serialization JSON ライブラリを使う
ライブラリの導入コストがかかるがJSON⇔配列のエンコード・デコードが楽にできる。特に配列をSharedPreferencesに保在したいときに便利
以上、AndroidでのJSON⇔配列の変換でした。ではまた
もしもっといい方法があれば教えてください。