我有一个类似
的JSON对象{
"tsp": "ABC" // can be only one of three things: "ABC", "DEF", "GHI"
"userId" : "lkajsdlk-199191-lkjdflakj"
}
而不是像这样写数据类
data class User(@SerializedName("tsp") val tsp: String, @SerializedName("userId") val userId: String
我想有一个定义三个值的枚举,以便我的数据类可以是
data class User(@SerializedName("tsp") val tsp: TspEnum, @SerializedName("userId") val userId: String
我尝试编写一个枚举
enum class TspEnum(provider: String) {
AY_BEE_CEE("ABC"),
DEE_EE_EFF("DEF"),
GEE_HAYTCH_I("GHI");
}
但是没有解决
我现在已经意识到,调用TspEnum.provider
将返回枚举的值,但是我不确定如何在将JSON序列化为kotlin数据类的同时使GSON协同工作
我已阅读到https://discuss.kotlinlang.org/t/json-enum-deserialization-breakes-kotlin-null-safety/11670
,其中涉及Kotlin键入和GSON的问题但是,人将头发的颜色序列化为一个枚举的方式与我的tsp json对象完全不同,足以让我挠头。
任何有关我要去哪里的指示都很好,欢呼!
答案 0 :(得分:1)
您可以为g(C)
创建反序列化器:
TspEnum
接下来,您必须注册它:
class TspDeserializer : JsonDeserializer<TspEnum> {
override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): TspEnum {
val stringValue = json.asString
for (enum in TspEnum.values()) {
if (enum.provider == stringValue) {
return enum
}
}
throw IllegalArgumentException("Unknown tsp $stringValue!")
}
}
然后您可以解析用户:
val gson = GsonBuilder()
.registerTypeAdapter(TspEnum::class.java, TspDeserializer())
.create()