1

3 つのタイプ (タイプ A、B、および C とします) のいずれかのリストを返すデータ フィードがあります。上記のタイプはすべて 2 つのプロパティを共有し、残りのプロパティはタイプに固有です。パターンを使ってみました。

abstract class Parent (val type: String, val id: String)

data class TypeA(override val type: String ... )
data class TypeB(override val type: String ... )

Retrofit を使用して、リストをデシリアライズしようとしています

List<? extends Parent>

Kotlinでは

List<out Parent>

ただし、GSON は抽象化された親クラスをインスタンス化する際に逆シリアル化エラーをスローしています。

java.lang.RuntimeException: Failed to invoke public com.XX.Parent() with no args

Kotlinでこれを実装する方法はありますか?

4

1 に答える 1

0

質問に Moshi のタグが付けられているので、MOSHI の を使用してタグ付けする方法を紹介しPolymorphicJsonAdapterFactoryます。オブジェクトのプロパティの値に応じて、基本的に何かをさまざまなタイプに解析できます。

最初に行うことは、親の型をシール クラスとして宣言し、それから他の型を拡張することです。

sealed class Parent(val type: String){
    data class TypeA(override val type: String, ... ): Parent(type) 
    data class TypeB(override val type: String, ... ): Parent(type) 
}

次に、Moshi にParentオブジェクトの解析方法を教えます。あなたはそれを登録しますPolymorphicJsonAdapterFactory

val moshi = Moshi.Builder()
      .add(PolymorphicJsonAdapterFactory.of(Parent::class.java, "type")
          .withSubtype(TypeA::class.java, "typeA")
          .withSubtype(TypeB::class.java, "typeB")
      .build()

それで、プロパティ「type」の値が「typeA」の場合、TypeAインスタンスにデシリアライズされます。のようにTypeB、プロパティ "type" が "typeB" の場合

ここで別の例を見ることができます: https://github.com/square/moshi/blob/master/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java

于 2020-12-02T10:59:39.920 に答える