Mar*_*ann 5 enums android json gson kotlin
我使用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
}
Run Code Online (Sandbox Code Playgroud)
专注于枚举反序列化 - 这对于字段与已知枚举匹配或 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)
Run Code Online (Sandbox Code Playgroud)
Gson 通过将 null 分配给非 null 类型来愚弄 Kotlin 的 null 安全机制。问题 - 如何将未知的 JSON 枚举映射到默认的 Kotlin 枚举?我的目标是通过简单的实现来保持零安全性。
PS - 我知道我可以将 JSON 枚举解析为 Int,然后将它们反序列化,或者使用支持字段和自定义 getter,但我喜欢直接解析到 Kotlin 枚举的优雅和类型安全。
我为 Gson 编写了一个 Kotlin 包装器(称为 Arson),它将缺失的默认值添加到反序列化对象中。除此之外,它还会检查违反 Kotlin 非空安全性的空值。
查看: https: //github.com/taskbase/arson
在您的项目中使用它:
<dependency>
<groupId>com.taskbase.arson</groupId>
<artifactId>arson</artifactId>
<version>1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
class ArsonTest {
@Test
fun testEnumDeserialization() {
val json = "{'name':'Jim', 'hairColor':'3'}"
// Gson deserializes the value to null
val p1 = Gson().fromJson(json, Person::class.java)
assertNull(p1.hairColor)
// The wrapper replaces null with the default value
val p2 = Arson(gson = Gson()).fromJson(json, Person::class.java)
assertEquals(Color.NONE, p2.hairColor)
}
}
data class Person(
val name: String = "",
val age: Int = 0,
val hairColor: Color = Color.NONE
)
enum class Color {
@SerializedName("1")
BROWN,
@SerializedName("2")
BLONDE,
NONE
}
Run Code Online (Sandbox Code Playgroud)
我也因 Gson 缺乏 Kotlin 支持而苦苦挣扎。Gson是一个Java库,不理解Kotlin的类型系统。我测试了其他几个 JSON 库,但没有一个运行得足够好。因此,我编写了一个函数,使用 Kotlin 反射库创建对象的深层副本,以添加缺少的默认值。
| 归档时间: |
|
| 查看次数: |
3082 次 |
| 最近记录: |