【发布时间】:2019-07-11 00:46:27
【问题描述】:
我使用 Kotlin data classes 和 GSON 反序列化 JSON 模式,并实现默认值以防止 JSON 中的空对象。此外,JSON int 枚举使用 @SerializedName 注释映射到 Kotlin 枚举值:
data class Person(@SerializedName("name")
val name: String = ",
@SerializedName("age")
val age: Int = 0,
@SerializedName("hairColor")
val hairColor: Color = Color.NONE)
enum class Color{
@SerializedName("1")
BROWN,
@SerializedName("2")
BLONDE,
NONE
}
专注于枚举反序列化 - 这适用于字段与已知枚举匹配或 JSON 中完全不存在该字段的情况,在这种情况下将实现默认枚举。
但是 - 如果 JSON 中接收到的枚举 不 映射到我的 kotlin 枚举中的已知枚举值 - 生成的反序列化枚举将为空!!
{"name":"Joe","age":10,"hairColor":1} ->
Person(name=Joe, age=10, hairColor=BROWN)
{"name":"Jim"} ->
Person(name=Jim, age=0, hairColor=NONE)
{"name":"Jeff", "age":8,"hairColor":3) ->
Person(name=Jane, age=8, hairColor=null)
Gson 通过将 null 分配给非 null 类型来欺骗 Kotlin 的 null 安全机制。 问题 - 如何将未知的 JSON 枚举映射到默认的 Kotlin 枚举?我的目标是通过简单的实现来保持空值安全。
附: - 我知道我可以将 JSON 枚举解析为 Ints,然后反序列化它们,或者使用支持字段和自定义 getter,但我喜欢直接解析为 Kotlin 枚举的优雅和类型安全。
【问题讨论】:
-
我认为最简单的方法是定义getter方法。见blog.jensdriller.com/…的最后一段
-
或者,也可以使用a custom
JsonDeserializer。 -
值得一提的是,如果您可以使用 Jackson,它会提供 a module 以支持 Kotlin。
标签: android json kotlin enums gson