Moshi 1.9.1 Kotlinタイプをシリアル化できません


12

Moshi 1.8.0を使用してデータをシリアライズ/デシリアライズする作業コードがあります

1.9.1にアップグレードすると、シリアライズしようとするとクラッシュするようになりました。

java.lang.IllegalArgumentException:Kotlinタイプcom.xxx.Spotをシリアル化できません。kotlin-reflectを使用しないKotlinクラスのリフレクトシリアライズには、未定義の予期しない動作があります。moshi-kotlinアーティファクトのKotlinJsonAdapterを使用するか、moshi-kotlin-codegenアーティファクトのコードgenを使用してください。

シリアライザのコードは次のとおりです。

val moshi = Moshi.Builder().build()
val dataListType = newParameterizedType(List::class.java, T::class.java)
val adapter: JsonAdapter<List<T>> = moshi.adapter(dataListType)
val json = adapter.toJson(dataList)

対応するTクラスは

@IgnoreExtraProperties
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

ここで何をすればいいのか全く分かりません。

助けてくれてありがとう!


使用している依存関係を表示してください
coroutineDispatcher

回答:


14

データクラスの前に@JsonClass(generateAdapter = true)を追加する必要があります

@JsonClass(generateAdapter = true) 
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

2
なぜそれが必要なのですか?
Morten Holmgaard

5
...対応するkapt設定をビルドに含めます。詳細はこちら:github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
ありがとう、うまくいきました!@JsonClass(generateAdapter =真)+ + kaptトリックた「もしもし」に「モシ-kotlin」からのGradle実装変化追加
ロレンツォ

0

を使用してワイルドカードを抑制でき@JvmSuppressWildcardsます。

このような

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.