为什么在GSON中使用JsonNull?

kpbpu008  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(154)

文档中说如果不存在这样的成员,JsonObject#get方法返回null。有时会返回JsonNull对象而不是null
检查GSON中是否存在某个字段的习惯用法是什么?我希望避免这种笨拙的风格:

jsonElement = jsonObject.get("optional_field");
if (jsonElement != null && !jsonElement.isJsonNull()) {
    s = jsonElement .getAsString();
}

为什么GSON使用JsonNull而不是null
有一个答案whatnullJsonNull之间的差异。在我的问题上面,我寻找的原因。

xoshrz7s

xoshrz7s1#

Gson大概是想对JSON中缺少值和存在JSON value null之间的区别进行建模。

{}
{"key":null}

您的应用程序可能会认为它们是相同的,但JSON格式却不会。
正在呼叫

JsonObject jsonObject = new JsonObject(); // {}
jsonObject.get("key");

返回Java值null,因为不存在具有该名称的成员。
正在呼叫

JsonObject jsonObject = new JsonObject();
jsonObject.add("key", JsonNull.INSTANCE /* or even null */); // {"key":null}
jsonObject.get("key");

会传回JsonNull型别(JsonNull.INSTANCE所指涉的单一)的执行严修,因为确实存在具有该名称的成员,而且其值为JSON null,由JsonNull值表示。

voase2hg

voase2hg2#

我知道这个问题并不是在要求一个解决方案,但我来这里是为了寻找一个解决方案。所以我会把它贴出来,以防别人需要它。
下面的Kotlin扩展代码省去了为每个元素分别检查nullisJsonNull的麻烦

import com.google.gson.JsonElement
import com.google.gson.JsonObject

fun JsonObject.getNullable(key: String): JsonElement? {
    val value: JsonElement = this.get(key) ?: return null

    if (value.isJsonNull) {
        return null
    }

    return value
}

而不是像这样打电话

jsonObject.get("name")

你这样打电话

jsonObject.getNullable("name")

在嵌套结构中工作得特别好。

val name = jsonObject.getNullable("owner")?.asJsonObject?.
    getNullable("personDetails")?.asJsonObject?.
    getNullable("name") 
    ?: ""

相关问题