下面的代码显示gson.fromJson()将忽略Kotlin数据类not null。
data class Test(val txt:String)
val gson=Gson()
val testClass=gson.fromJson("{\"txt\":null}",Test::class.java)
代码中的testClass将获得一个null txt属性。这是可以理解的,因为空检查是在编译时发生的。
但是如果val txtNotNull=testClass.txt?:"not null"
呢?
这是一种糟糕的代码风格(未定义的行为),还是在Kotlin中使用gson是不明智的?
3条答案
按热度按时间tjjdgumg1#
Gson使用反射来设置数据类的属性。这就是为什么Kotlin检查不在对象构造期间运行。然后,您可以在Kotlin中将
null
转换为非null类型。您的代码将工作,但您将从编译器获得警告:
Elvis算子(?:)始终返回不可为空类型String的左操作数
有一个很酷的官方库kotlinx.serialization,它是为在Kotlin中使用而编写的。
mbskvtky2#
Gson不知道Kotlin的非空类型。
您可以创建自己的TypeAdapterFactory,以便在json中的任何值(在Kotlin对象中不应为null)为null时抛出异常。
请看这篇文章:
https://medium.com/swlh/using-gson-with-kotlins-non-null-types-468b1c66bd8b
zpgglvta3#
事实上,Gson在其中隐藏一个空值不是问题。问题是,您将一个属性标记为不可空,而 * 应该 * 是可空的,因为它可以在您导入的JSON中省略。您应该使属性可为空,然后如果您使用像
val txtNotNull=testClass.txt?:"not null"
这样的东西,它实际上是有意义的。