我可能只是因为我是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?
答案 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
注释,则上述关于将值显式添加到变量的内容为真。