文档说如果不存在这样的成员,JsonObject#get方法将返回null。这不准确;有时返回JsonNull
对象而不是null
。
检查GSON中是否存在特定字段的惯用法是什么?我希望避免这种笨重的风格:
jsonElement = jsonObject.get("optional_field");
if (jsonElement != null && !jsonElement.isJsonNull()) {
s = jsonElement .getAsString();
}
为什么GSON使用JsonNull
代替null
?
what的答案是null
和JsonNull
之间的差异。在上面的问题中,我正在寻找原因。
答案 0 :(得分:11)
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扩展代码下面,省去了分别检查每个元素null
和isJsonNull
的麻烦
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")
?: ""