为什么Moshi在使用fromJson解析json时会返回一个可以为空的对象?

时间:2018-03-03 23:57:38

标签: kotlin moshi

我可能只是因为我是Kotlin和Moshi的新手而错了。

data class InitialAppResult(val status: Int, val message: String, val baseprm: String)

val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()  
val adapter = moshi.adapter(InitialAppResult::class.java)
val fromJson = adapter.fromJson(result.get())

为什么fromJson可以为null并且需要!!要么 ?。例如:fromJson!!.baseprm

如果解析失败并且缺少必填字段,则只会在我的情况下抛出异常。那么如何解析“无效”的JSON响应并且不会失败,即返回null?

1 个答案:

答案 0 :(得分:1)

Moshi是一个用Java实现的库,而你的代码是用Kotlin编写的。引自文档的“Calling Java code from Kotlin”部分:

  

Java中的任何引用都可能为null,这使得Kotlin对严格的null安全性的要求对来自Java的对象不切实际。

这意味着默认情况下来自Java的任何对象都可以为空。 但是,如果您声明变量具有非可空类型,Kotlin将自动“强制转换”它:

  

当平台值[即本例中的Java对象]被分配给Kotlin变量时,我们可以依赖于类型推断(该变量将具有推断的平台类型,如上面的示例中的项目所示),或者我们可以选择我们期望的类型(允许可空和非空类型)。

这是一个例子(再次来自上面链接的文档),其中item是一个Java对象:

val nullable: String? = item // allowed, always works
val notNull: String = item // allowed, may fail at runtime

因此,在您的情况下,您可以通过键入以下内容强制对象不可为空:

val fromJson: InitialAppResult = adapter.fromJson(result.get())

修改

在这种情况下,所有fromJson方法都定义为@Nullable,这意味着结果可以是null,因此推断类型可以为空。这同样适用于@NotNull。因此,这些注释在Java和Kotlin之间的互操作性方面非常有用。

在其他情况下,如果缺少@Nullable@NotNull注释,则上述关于将值显式添加到变量的内容为真。