当前位置: 首页 > 知识库问答 >
问题:

为什么Moshi在用FromJSON解析json时返回一个nullable对象?

强宾白
2023-03-14

可能只是我用错了,因为我对Kotlin和Moshi是新的。

数据类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个答案

权承
2023-03-14

Moshi是一个用Java实现的库,而您的代码是用Kotlin编写的。引用文档中的“从Kotlin调用Java代码”一节:

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

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

当一个平台值[在本例中是一个Java对象]被分配给一个Kotlin变量时,我们可以依靠类型推断(该变量将具有一个推断出的平台类型,就像上面示例中item所具有的那样),或者我们可以选择我们期望的类型(允许nullable和non-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())

在本例中,所有fromjson方法都定义为@nullable(因为null是有效的JSON值),这意味着结果可以是null,因此推断的类型是nullable。这同样适用于@Notnull。因此,这些注释对于Java和Kotlin之间的互操作性非常有用。

在其他情况下,如果缺少@nullable@notnull注释,则上面所说的显式地将值添加到变量中是正确的。

为什么fromjson被标记为@nullable

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

  • null
  • {“键”:null}
@Override public Object fromJson(JsonReader reader) throws IOException {
    ...
    case NULL:
      return reader.nextNull();
}

使用JSON流中的下一个令牌并断言它是一个文字空值。返回NULL。

 类似资料:
  • 首先,我收到来自post string属性和来自控制器的inputStream。 接下来,我的服务调用ParseGeojosnStream以流式传输文件的内容。 接下来,传递特性的名称和列表,并将其插入表中。 最后,使用字符串属性和表名作为id创建scheme。 那么,当强制转换为json并将其存储在数据库中时,为什么要返回一个空的属性对象呢? 代码如下: log.info(“jsonGeomet

  • 我试图使用Moshi+Kotlin解析一个设计得不是很好的API的json。出于某些原因,它将像71这样的数字解析为double。 第三方api有一个对象列表,可以类似于:{“foo”:[[1234567000,12]]}//long,int或{“foo”:[[1234567000,“string”,0,2]]}//long,string,int,int 由于第三方api,我有以下kotlin类:

  • 问题内容: 我最近一直在搞弄api,发现有些奇怪的地方。 返回一个对象。输出 但是,如果将其写为: 这是您可以访问标题属性的标准。 所以我的问题是:为什么要在对象文字中返回一个promise,但是如果刚返回则返回一个值? 问题答案: 为什么要兑现承诺? 因为您在所有标头到达后立即收到。调用使您对尚未加载的http响应的正文有了另一个保证。另请参见[为什么来自JavaScriptfetch API的

  • 我试图用Moshi解析一个Json响应,我遇到的问题是键的值是字符串上的Json换行: 这是我的课

  • 我的ServiceImpl.java类中有一个方法包含这一行: 但是当我从这个@Transactional方法返回Device对象后查看它时,我没有看到实际的DeviceModel属性,而是一个对象代理。 为什么会这样?关于hibernate和事务,我缺少什么让我相信这个方法应该返回完整的对象?

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果: