为什么GSON中的JsonNull?

时间:2016-08-24 04:11:43

标签: java gson

文档说如果不存在这样的成员,JsonObject#get方法将返回null。这不准确;有时返回JsonNull对象而不是null

检查GSON中是否存在特定字段的惯用法是什么?我希望避免这种笨重的风格:

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

为什么GSON使用JsonNull代替null

what的答案是nullJsonNull之间的差异。在上面的问题中,我正在寻找原因。

2 个答案:

答案 0 :(得分:11)

据推测,Gson想要模拟缺少值与JSON中JSON value null的存在之间的差异。例如,这两个JSON片段之间存在差异

{}
{"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值表示。< / p>

答案 1 :(得分:0)

我知道问题不是在寻求解决方案,但我是来这里寻求解决方案的。所以我会贴出来,以防别人需要。

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") 
    ?: ""