下面的代码显示 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 是不明智的?
Gson 使用反射为数据类设置属性。这就是为什么 Kotlin 检查不在对象构造期间运行的原因。然后,您可以在 Kotlin 中将
null
转换为非空类型。
您的代码可以运行,但您会收到编译器的警告:
Elvis 运算符 (?:) 始终返回不可空类型 String 的左操作数
有一个很酷的官方库 kotlinx.serialization 是为在 Kotlin 中使用而编写的。
Gson 不知道 kotlin 的非空类型。
如果 json 中的任何值(在 Kotlin 对象中不应该为 null)为 null,您可以创建自己的 TypeAdapterFactory 以抛出异常。
看到这篇文章:
https://medium.com/swlh/using-gson-with-kotlins-non-null-types-468b1c66bd8b
Gson 偷偷在里面放一个空值的事实不是问题。问题是您将应该可为空的属性标记为不可空,因为它可以在您导入的 JSON 中省略。您应该使该属性可为空,然后如果您使用像
val txtNotNull=testClass.txt?:"not null"
. 这样的东西,它实际上就有意义了