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