我正在阅读一个JSON文件(使用Google的GSON
)。我的一个测试检查程序在事件文件中的行为,一个给定的键丢失。
JsonElement value = e.getAsJsonObject().get(ENVIRONMENT);
我的期望是,当.get(ing)这个键时,我会得到null
。结果我得到了。当i .get(ENVIRONMENT)
时,返回的值是null
。
当我测试它的时候,我实际上得到了一个“not null"。奇怪的是,考虑到,GSON的javadoc说“提供了一个检查来验证这个元素是否代表一个null value 或者不是”
if (value.isJsonNull()) {
System.out.println("null");
} else {
System.out.println("not null");
}
请帮助我更好地理解这一点。
2条答案
按热度按时间zdwk9cvp1#
别介意我下面的第一个答案,我会读得太快。
看起来这是一个简单的文档撒谎的例子--或者至少是被误解了。幸运的是,代码不会那么容易撒谎,而且Gson是一个开源项目。
下面是
JsonObject.get(String)
:这里是
members
的填充位置:对
members
的add调用是针对Java类中定义的每个成员进行的--它并不基于JSON中的内容。(对于感兴趣的人来说,ReflectingFieldNavigator
中的visitFieldsReflectively
方法填充了成员。)因此,我认为混淆是围绕着“if no such member exists”子句中“member”的含义。根据代码,我推测JavaDoc的作者引用的是Java类中定义的成员。对于Gson API的普通用户--比如我自己--我假定“member”引用的是JSON中的对象元素。
现在,这个问题清楚了吗?
第一个答案基于问题的快速阅读(为有用的链接保留):
null
引用不是JsonNull
值。(value == null)
与value.isJsonNull()
不相同。它们非常不同。文档描述了对
JsonObject.get(String)
的调用返回“[n]ull if no such member exists”,但没有说明返回JsonNull
。对
JsonElement.isJsonNull()
的调用不是检查JsonElement
引用是否为null
引用。事实上,如果它是null
引用,调用它的方法将抛出NullPointerException
。它是检查它是否为JsonNull
示例。v440hwme2#
isJsonNull()处理json元素存在但json值为空的情况。get()返回Java空值意味着该元素不存在。下面是一个简单的示例:
詹森:
Java程式码:
参考文献:
JsonObject:public JsonElement get(String memberName)返回指定名称的成员。参数:memberName -正在请求的成员的名称。返回:返回与名称匹配的成员。如果不存在这样的成员,则为Null。
https://www.javadoc.io/doc/com.google.code.gson/gson/2.8.0/com/google/gson/JsonObject.html
值可以是双引号中的字符串、数字、true或false或***null***、对象或数组。这些结构可以嵌套。
https://www.json.org/json-en.html