web-dev-qa-db-ja.com

レトロフィットでKotlin列挙型をどのように使用しますか?

JSONを解析して列挙型でモデル化するにはどうすればよいですか?

これが私の列挙型クラスです:

enum class VehicleEnumEntity(val value: String) {
   CAR("vehicle"),
   MOTORCYCLE("motorcycle"),
   VAN("van"),
   MOTORHOME("motorhome"),
   OTHER("other")
}

typeを解析して列挙型にする必要があります

"vehicle":{"data":{"type": "vehicle"、 "id": "F9dubDYLYN"}}

[〜#〜]編集[〜#〜]

私は標準的な方法を試しましたが、列挙型をPOJOに渡すだけで常にnullになります

13
Drake
enum class VehicleEnumEntity(val value: String) {
   @SerializedName("vehicle")
   CAR("vehicle"),

   @SerializedName("motorcycle")
   MOTORCYCLE("motorcycle"),

   @SerializedName("van")
   VAN("van"),

   @SerializedName("motorhome")
   MOTORHOME("motorhome"),

   @SerializedName("other")
   OTHER("other")
}

ソース

32
LordRaydenMK

別のオプション:value(デフォルト)の代わりに、列挙型のnameを使用するカスタム(デ)シリアライザーを使用します。つまり、すべての列挙値に注釈を付ける必要はありませんが、代わりに列挙クラスに注釈を付けることができます(またはGsonBuilderにアダプターを追加します)。

interface HasValue {
    val value: String
}

@JsonAdapter(EnumByValueAdapter::class)
enum class VehicleEnumEntity(override val value: String): HasValue {
   CAR("vehicle"),
   MOTORCYCLE("motorcycle"),
   VAN("van"),
   MOTORHOME("motorhome"),
   OTHER("other")
}

class EnumByValueAdapter<T> : JsonDeserializer<T>, JsonSerializer<T>
    where T : Enum<T>, T : HasValue {
    private var values: Map<String, T>? = null

    override fun deserialize(
        json: JsonElement, type: Type, context: JsonDeserializationContext
    ): T? =
        (values ?: @Suppress("UNCHECKED_CAST") (type as Class<T>).enumConstants
            .associateBy { it.value }.also { values = it })[json.asString]

    override fun serialize(
        src: T, type: Type, context: JsonSerializationContext
    ): JsonElement = JsonPrimitive(src.value)
}

同じアダプタークラスを他の列挙型クラスで再利用できます。

5
ephemient