如何将JSON对象解析为枚举

时间:2019-08-15 03:37:52

标签: kotlin gson

我有一个类似

的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对象完全不同,足以让我挠头。

任何有关我要去哪里的指示都很好,欢呼!

1 个答案:

答案 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()