Android 未声明为可选的字段接受null作为值

Android 未声明为可选的字段接受null作为值,android,kotlin,Android,Kotlin,我有一个数据类 data class Bean { var value: String = "" } 我从服务器获取了一个Json: { "value":null } 我所期望的是,因为值不是可选的,所以不能分配空值,值将保持为”。但是使用调试器,我发现值为null,因此我调用它的某个方法引发以下异常: fun matches(stringToMatch: String): Boolean { return this.value.toLowerCase() ==

我有一个数据类

data class Bean {

    var value: String = ""

}
我从服务器获取了一个Json:

{
    "value":null
}
我所期望的是,因为
不是可选的,所以不能分配空值,
将保持为
。但是使用调试器,我发现
为null,因此我调用它的某个方法引发以下异常:

fun matches(stringToMatch: String): Boolean {
    return this.value.toLowerCase() == stringToMatch.toLowerCase()
}
kotlin.TypeCastException:null不能转换为非null类型java.lang.String


如何使
保持

您使用的是JSON反序列化库(GSON?),它通过完全避开内置的初始化来创建对象。它很可能使用一个低级的非JDK调用
sun.misc.Unsafe.allocateObject()
,为对象分配一个原始数据块,然后从解析的JSON填充它

真正解决这个问题的唯一方法是使用这样一个JSON库,它理解Kotlin并可以复制其对象初始化规则


顺便说一句,您的特定JSON示例(显式地将
null
分配给非null属性)不应该使用默认值,而应该抛出一个验证异常。

您使用的是JSON反序列化库(GSON?),它通过完全避开内置的初始化来创建对象。它很可能使用一个低级的非JDK调用
sun.misc.Unsafe.allocateObject()
,为对象分配一个原始数据块,然后从解析的JSON填充它

真正解决这个问题的唯一方法是使用这样一个JSON库,它理解Kotlin并可以复制其对象初始化规则


顺便说一句,您的特定JSON示例将
null
显式分配给非null属性,不应使用默认值,而是引发验证异常。

是的,我正在使用Gson。所以实际上,我应该声明所有字段都是可选的?这是唯一一种匹配GSON将要使用它们的方法。并且不提供其他默认值,只提供
null
。作为一种解决方法,您可以构建这样一个“原始”对象,仅用于反序列化,然后通过传入原始对象来创建真正的域对象,然后应用复制数据的所有逻辑。是的,我使用的是Gson。所以实际上,我应该声明所有字段都是可选的?这是唯一一种匹配GSON将要使用它们的方法。并且不提供其他默认值,只提供
null
。作为一种解决方法,您可以构建这样一个“原始”对象,仅用于反序列化,然后通过传入原始对象来创建真正的域对象,然后应用复制数据的所有逻辑。