繁体   English   中英

如何获得枚举改型的价值?

[英]How to get value of enum throw retrofit?

我有一些枚举值,称为Counter

enum class Counter{
    none,
    few,
    many
}

我想通过改型在模型中获取此枚举的价值,所以我创建了一个对象

data class Test(
        var param1: String?,
        var param2: String?,
        var counter: Counter?,
)

但是,当我将这种类似的模型用于Retrofit方法时,尽管服务器的响应为{"param1": "String1", "param2": "String2", "counter": "many"} ,但我仅获得param1和param 2。 {"param1": "String1", "param2": "String2", "counter": "many"}

如何获取计数器的值,不要在模型var counter: String?

像这样创建你的枚举

enum class Counter{
    @SerializedName("none")
    none("none"),

    @SerializedName("few")
    few("few"),

    @SerializedName("many")
    many("many")
}

您可以使用JsonDeserializer对网络调用进行自定义反序列化。

class TestDeserializer: JsonDeserializer<Test> {

    override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Test {
        val obj = json.asJsonObject

        val param1 = obj.get("param1")?.asString
        val param2 = obj.get("param2")?.asString

        val counter = when(obj.get("counter")?.asString) {
            "none" -> Counter.none
            "few" -> Counter.few
            "many" -> Counter.many
            else -> throw IllegalArgumentException("Counter type unknown.")
        }

        return Test(param1, param2, counter)
    }
}

而且,您在创建Retrofit客户端时只需注册它即可。

val gson = GsonBuilder()
        .registerTypeAdapter(Test::class.java, TestDeserializer())
        .create()

return Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM