如何使用Kotlin enum与Retrofit?

时间:2017-08-07 18:18:49

标签: android enums gson kotlin retrofit2

如何使用枚举将JSON解析为模型?

这是我的枚举类:

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

我需要将type解析为枚举

  

" vehicle":{             "数据":{               "输入":" vehicle",               " id":" F9dubDYLYN"             }           }

修改

我尝试过标准方式,只需将我的枚举传递给POJO,它总是为空

2 个答案:

答案 0 :(得分:29)

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 :(得分:5)

另一种选择:使用使用枚举的value的自定义(de)序列化程序,而不是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)
}

相同的适配器类可以在其他枚举类上重用。