LoginSignup
0
0

Kotlin Serizalizationを使ってみた

Posted at

業務アプリのjsonパーサーをmoshiからKotlin Serializationに置き換えました。(新規のAPIに対するものだけですが)
そのときのまとめです。

準備

gradle pluginを使います。
(アノテーションに必要なのかな?)

root/build.gradle
plugins {
    kotlin("plugin.serialization").version("1.9.0").apply(false)
}
module/build.gradle
plugins {
    kotlin("plugin.serialization")
}

ライブラリを入れます。

module/build.gradle
dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0"
}

サンプルではバージョンカタログを使っている。

jsonをkotlinクラスにパースするときのkotlinクラスを定義

hello.class
@Serializable
data class Hello (
    val hello: String,
    val hello2: String? = null
)

ここで役に立ったのはopen API。
swaggerのapiの仕様をコピー。
その後、bing AIにお願いすると、
image.png

画像はswaggerのyamlを貼っていますが、guiのビューをコピーでもいけます。
これ、ネストしたオブジェクトを内部クラスとして定義したりもできます。
数が多いと大変なので便利です。

デコード

Androidではリソースにjsonを配置して扱えます。

res/raw/test.json
{
  "hello": "world"
}

これをデコードして、ログ出力させます。

KotlinSerializationPlayground.class
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置き換える価値は高いと思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0