moshi 1.9.0以上を使う場合に、Cannot serialize Kotlin typeが出たときの対処法

エラー集

 私がmoshi 1.9.0を使おうとすると下記のようなエラーが出てきました。(xxxxxはパッケージ名とクラス)

Cannot serialize Kotlin type xxxxxx. Reflective serialization of Kotlin classes without using kotlin-reflect has undefined and unexpected behavior. Please use KotlinJsonAdapter from the moshi-kotlin artifact or use code gen from the moshi-kotlin-codegen artifact.

 これはmoshi 1.9.0からはkotlin-reflectまたはmoshi-kotlin-codegenを全てのKotlinクラスに利用する必要があるからとのことですので、下記の対処法のどちらかを行いましょう

moshi/CHANGELOG.md at master · square/moshi
A modern JSON library for Kotlin and Java. Contribute to square/moshi development by creating an account on GitHub.

KotlinJsonAdapterFactoryを利用する

 Moshiのインスタンスを作成するときに、下記のように.add()を追加して、Kotlin用のアダプターを追加しましょう。

Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

codegenアノテーションプロセッサを利用する

 data classなどに下記のアノテーションを追加しましょう。

@JsonClass(generateAdapter = true)
data class Sample(
        val hoge: Hoge,
        val fuga: Fuga
)

余談

 1.9.0以上の変更については、以前はMoshiはKotlinとjavaを区別していなかったようなのですが、nullをNonNullのフィールドに入れてしまうなどの悪影響が大きかったため、このような修正に至ったようです。

コメント