【问题标题】:How use Kotlin enum with Retrofit?如何将 Kotlin 枚举与 Retrofit 结合使用?
【发布时间】:2018-01-15 03:20:37
【问题描述】:

如何解析 JSON 以使用枚举建模?

这是我的枚举类:

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

我需要将type 解析成一个枚举

“车辆”:{ “数据”: { “类型”:“车辆”, “id”:“F9dubDYLYN” } }

编辑

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

【问题讨论】:

  • 你有没有尝试过?
  • @lelloman 是的,我已经尝试过标准方式,只需将我的枚举传递给 POJO,它总是为空
  • 也许在你的问题中值得一提
  • 我认为这里最相关的部分是您使用的是哪个转换器... GSON 或其他什么?
  • 你试过使用@SerializedName注解吗?根据这个stackoverflow.com/questions/25423590/enum-annotations-in-kotlin 它应该可以工作

标签: android enums gson kotlin retrofit2


【解决方案1】:
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

【讨论】:

  • 这是一个 GSON 解决方案,为 moshi 更改为 @Json(name="foo")
  • @ravidrinek 请提出一个新问题,并包括所有相关细节,例如json 解析库等...
【解决方案2】:

另一个选项:使用使用枚举的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)
}

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

【讨论】:

  • 如果枚举类型是字符串,这很好用。有没有办法为任何类型创建通用适配器?我认为最常见的枚举值是字符串和整数,但如果有一种通用的方法来序列化任何类型,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多