業務アプリのjsonパーサーをmoshiからKotlin Serializationに置き換えました。(新規のAPIに対するものだけですが)
そのときのまとめです。
準備
gradle pluginを使います。
(アノテーションに必要なのかな?)
plugins {
kotlin("plugin.serialization").version("1.9.0").apply(false)
}
plugins {
kotlin("plugin.serialization")
}
ライブラリを入れます。
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0"
}
サンプルではバージョンカタログを使っている。
jsonをkotlinクラスにパースするときのkotlinクラスを定義
@Serializable
data class Hello (
val hello: String,
val hello2: String? = null
)
ここで役に立ったのはopen API。
swaggerのapiの仕様をコピー。
その後、bing AIにお願いすると、
画像はswaggerのyamlを貼っていますが、guiのビューをコピーでもいけます。
これ、ネストしたオブジェクトを内部クラスとして定義したりもできます。
数が多いと大変なので便利です。
デコード
Androidではリソースにjsonを配置して扱えます。
{
"hello": "world"
}
これをデコードして、ログ出力させます。
class KotlinSerializationPlayground(val context: Context) {
fun decodeTest() {
val jsonFile = context.resources.openRawResource(R.raw.test)
val json = Json { ignoreUnknownKeys = true}
val value = json.decodeFromStream<Hello>(jsonFile)
Log.d("tag", value.hello)
}
}
これで出力されました。
もちろんretrofitとも使えます。
json Builderの設定
上のignoreUnknownKeysとかのことです。
下記以外にもいろいろあります。
パースするときのルールみたいなものの設定ですね。
プロパティ | 説明 |
---|---|
ignoreUnknownKeys | defaultでfalse。入力JSON内の未知のプロパティに遭遇した場合に、無視するか、例外を発生させるかどうか。defaultだと、例外を発生させるということ。 |
coerceInputValues | 不正なJSON値をデフォルトのプロパティ値に強制できるようにする |
retrofitとの運用
あまり今回は踏み込みませんが、Retrofit.Builder()を作るときにmoshiとの違いが出るようです。
addConverterFactoryで適用するfactoryが違います。
そのときに上記JsonBuilderを使うようですね。
moshiとの違いを含めて【Kotlin1.4】kotlinx.serializationとMoshiを比較してみた - Qiita がわかりやすいです。
moshiとの違い
jsonをデコードするdecodeFromStream関数による記述がかなりわかりやすくなっていると思います。
KMPの導入も見越してKotlin Serialization置き換える価値は高いと思いました。