[英]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.