gson 如何将Kotlinenum与Retrofit配合使用?

8wigbo56  于 2022-11-06  发布在  Kotlin
关注(0)|答案(2)|浏览(190)

如何解析JSON以使用枚举建模?
下面是我的枚举类:

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

我需要将type解析为一个枚举
“车辆”:{“数据”:{【类型】:【车辆】,【编号】:“F9dubDYLYN”} }

编辑

我已经尝试了标准方法,只要将我的枚举传递给POJO,它总是为空

eufgjt7s

eufgjt7s1#

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

l5tcr1uw

l5tcr1uw2#

另一个选项:使用自定义(反)序列化器,该序列化器使用枚举的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)
}

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

相关问题