Kotlin '?:' 在数据类字段/属性不为空但 Gson 将其设置为空时有效吗?

问题描述 投票:0回答:3

下面的代码显示 gson.fromJson() 将忽略不为空的 kotlin 数据类。

data class Test(val txt:String)

val gson=Gson()
val testClass=gson.fromJson("{\"txt\":null}",Test::class.java)

代码中的testClass会得到一个空的txt属性。可以这么理解,因为null check发生在编译的时候。

但是如果

val txtNotNull=testClass.txt?:"not null"
怎么办?

它是一种糟糕的代码风格(未定义的行为),还是在 Kotlin 中使用 gson 是不明智的?

kotlin gson
3个回答
1
投票

Gson 使用反射为数据类设置属性。这就是为什么 Kotlin 检查不在对象构造期间运行的原因。然后,您可以在 Kotlin 中将

null
转换为非空类型。

您的代码可以运行,但您会收到编译器的警告:

Elvis 运算符 (?:) 始终返回不可空类型 String 的左操作数

有一个很酷的官方库 kotlinx.serialization 是为在 Kotlin 中使用而编写的。


1
投票

Gson 不知道 kotlin 的非空类型。

如果 json 中的任何值(在 Kotlin 对象中不应该为 null)为 null,您可以创建自己的 TypeAdapterFactory 以抛出异常。

看到这篇文章:

https://medium.com/swlh/using-gson-with-kotlins-non-null-types-468b1c66bd8b


0
投票

Gson 偷偷在里面放一个空值的事实不是问题。问题是您将应该可为空的属性标记为不可空,因为它可以在您导入的 JSON 中省略。您应该使该属性可为空,然后如果您使用像

val txtNotNull=testClass.txt?:"not null"
.

这样的东西,它实际上就有意义了
© www.soinside.com 2019 - 2024. All rights reserved.