2017-08-07 3 views
0

Comment puis-je analyser JSON pour modéliser avec enum?Comment utiliser Kotlin enum avec Retrofit?

Voici ma classe enum:

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

et je dois analyser type dans un ENUM

"véhicule": { "data": { "type": « véhicule », "id": "F9dubDYLYN" }}

EDIT

J'ai essayé de manière standard, juste passer mon ENUM à POJO et toujours null

+0

avez-vous essayé quelque chose? – lelloman

+0

@lelloman oui, j'ai essayé de manière standard, il suffit de passer mon enum à POJO et il est toujours nul – Drake

+0

peut-être il vaut la peine de le mentionner dans votre question – lelloman

Répondre

4
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

1

Une autre option consiste à utiliser un sérialiseur sur mesure (de) qui utilise le value de l'énumération, au lieu de name (par défaut). Cela signifie que vous n'avez pas besoin d'annoter chaque valeur enum, mais que vous pouvez annoter la classe enum (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 enum.