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

Kotlin 为什么Moshi在使用fromJson解析json时返回可为空的对象?,kotlin,moshi,Kotlin,Moshi,可能只是我用错了,因为我对科特林和莫西都是新手 data class InitialAppResult(val状态:Int,val消息:String,val baseprm:String) 为什么fromJson是空的,并且需要一个!!或例如:fromJson!!。baseprm 如果解析失败,并且缺少一个必需字段,那么在我的例子中,它只会抛出一个异常。那么,它如何解析一个“无效”的JSON响应而不失败,即返回null呢?Moshi是一个用Java实现的库,而您的代码是用Kotlin编写的。引用

可能只是我用错了,因为我对科特林和莫西都是新手

data class InitialAppResult(val状态:Int,val消息:String,val baseprm:String)

为什么fromJson是空的,并且需要一个!!或例如:
fromJson!!。baseprm


如果解析失败,并且缺少一个必需字段,那么在我的例子中,它只会抛出一个异常。那么,它如何解析一个“无效”的JSON响应而不失败,即返回null呢?

Moshi是一个用Java实现的库,而您的代码是用Kotlin编写的。引用文件第“”节中的内容:

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

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

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

下面是一个示例(同样来自上面链接的文档),其中
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())
编辑 在这种情况下,所有来自JSON的
方法都被定义为
@Nullable
(因为
null
是一个有效的JSON值),这意味着结果可以是
null
,因此推断的类型可以为null。这同样适用于
@NotNull
。因此,这些注释对于Java和Kotlin之间的互操作性非常有用

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

编辑:2020年7月21日 为什么来自JSON的
标记为
@Nullable

原因是
null
是一个有效的JSON值。以下示例都是有效的JSON字符串:

  • null
  • {“key”:null}
因此,
JsonAdapter
需要能够处理
null
值。例如,以下是内置函数如何处理
null
s:

@Override public Object fromJson(JsonReader reader) throws IOException {
    ...
    case NULL:
      return reader.nextNull();
}
这取决于
nextNull
,其上写着:

使用JSON流中的下一个令牌,并断言它是文本null。返回null


谢谢,假设这是因为Moshi是用Java编写的。我也在寻找更优雅的方式来声明它不会为null,就像你在最后一行中所做的那样。这并不能解释为什么来自JSON的
标记为
@Nullable
。它什么时候可以返回
null
?@user3681304我假设这是因为
null
是一个有效的JSONvalue@user3681304我已经编辑了我的答案,其中包含了有关返回
null
的原因和方式的更多详细信息。希望有帮助
@Override public Object fromJson(JsonReader reader) throws IOException {
    ...
    case NULL:
      return reader.nextNull();
}