タイプによって構造の異なるJSONをmoshiでパースする

Kenji Abe
2 min readNov 28, 2018

--

例えば、次のような感じのJSONをパースしたいときにどうするか?

[  
{
"type":"rectangle",
"width":100,
"height":200
},
{
"type":"circle",
"radius":50
}
]

typeによってJSONの構造が異なっています。これをmoshiでパースしてみます。

build.gradle

implementation "com.squareup.moshi:moshi:1.8.0"
implementation "com.squareup.moshi:moshi-adapters:1.8.0"
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"

ここで moshi-adapters というのを追加しています。

data class

sealed classを使って、それぞれRectangleとCircleというクラスを作っています。パースしてこれらのクラスにマッピングします。

パース

最後にパースの処理です。

PolymorphicJsonAdapterFactory というのを使っています。
of で親となるクラスと、分類するJSONキーを指定します。
withSubtype でJSONの値とそれに対応するクラスを指定します。

これで簡単にパースすることができます。

便利!!

--

--

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO