web-dev-qa-db-fra.com

Comment utiliser Kotlin enum avec Retrofit?

Comment analyser JSON pour modéliser avec enum?

Voici ma classe d'énumération:

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

et j'ai besoin d'analyser type dans une énumération

"véhicule": {"données": {"type": "véhicule", "id": "F9dubDYLYN"}}

MODIFIER

J'ai essayé de manière standard, il suffit de passer mon énumération à POJO et c'est toujours nul

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")
}

Source

32
LordRaydenMK

Autre option: utilisez un (dé) sérialiseur personnalisé qui utilise le value de l'énumération, au lieu du name (par défaut). Cela signifie que vous n'avez pas besoin d'annoter chaque valeur d'énumération, mais à la place, vous pouvez annoter la classe d'énumération (ou ajouter l'adaptateur à 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)
}

La même classe d'adaptateur est réutilisable sur d'autres classes d'énumération.

5
ephemient