我使用Kotlin数据类
和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枚举中的已知枚举值,则反序列化的枚举将为null!
{"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赋值给非空类型来欺骗Kotlin的空安全机制。问题在于如何将未知的JSON枚举映射到默认的Kotlin枚举?我的目标是通过简单的实现来保持空安全。
附注:我知道我可以将JSON枚举解析为Int,稍后再进行反序列化,或者使用支持字段和自定义getter,但我喜欢直接解析为Kotlin枚举的优雅和类型安全性。
JsonDeserializer
(https://github.com/google/gson/blob/master/UserGuide.md#TOC-Writing-a-Deserializer)。 - CommonsWare