GSON:.isJsonNull()问题

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

我正在阅读一个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");
}

请帮助我更好地理解这一点。

zdwk9cvp

zdwk9cvp1#

别介意我下面的第一个答案,我会读得太快。
看起来这是一个简单的文档撒谎的例子--或者至少是被误解了。幸运的是,代码不会那么容易撒谎,而且Gson是一个开源项目。
下面是JsonObject.get(String)

/**
   * Returns the member with the specified name.
   *
   * @param memberName name of the member that is being requested.
   * @return the member matching the name. Null if no such member exists.
   */
  public JsonElement get(String memberName) {
    if (members.containsKey(memberName)) {
      JsonElement member = members.get(memberName);
      return member == null ? JsonNull.INSTANCE : member;
    }
    return null;
  }

这里是members的填充位置:

/**
   * Adds a member, which is a name-value pair, to self. The name must be a String, but the value
   * can be an arbitrary JsonElement, thereby allowing you to build a full tree of JsonElements
   * rooted at this node.
   *
   * @param property name of the member.
   * @param value the member object.
   */
  public void add(String property, JsonElement value) {
    if (value == null) {
      value = JsonNull.INSTANCE;
    }
    members.put($Gson$Preconditions.checkNotNull(property), value);
  }

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示例。

v440hwme

v440hwme2#

isJsonNull()处理json元素存在但json值为空的情况。get()返回Java空值意味着该元素不存在。下面是一个简单的示例:
詹森:

{
    "testElement": null
}

Java程式码:

if (json.get("testElement").isJsonNull())
{
    System.out.println("testElement is json null value"); //This will print.
}
if (json.get("nonExistentElement") == null)
{
    System.out.println("nonExistentElement does not exist"); //This will print.
}

参考文献:
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

相关问题