gpt4 book ai didi

json - GSON:.isJsonNull()问题

转载 作者:行者123 更新时间:2023-12-04 10:11:35 27 4
gpt4 key购买 nike

我正在读取JSON文件(使用Google的GSON)。我的一项测试在缺少给定键的事件文件中检查程序的行为。

JsonElement value = e.getAsJsonObject().get(ENVIRONMENT);

我的期望是,当.get(ing)这个键时,我会得到 null。原来我愿意。当我 .get(ENVIRONMENT)时,返回的值为 null

当我测试它时,我实际上得到了一个“ 而不是空”。很奇怪,考虑到,GSON的javadoc说“ 提供了检查,以验证此元素是否表示空值
if (value.isJsonNull()) {
System.out.println("null");
} else {
System.out.println("not null");
}

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

最佳答案

没关系,下面我的第一个答案。我读得太快了。

看起来这是文件说谎的简单情况-或至少被误解了。幸运的是,代码并非易事,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);
}

对Java类中定义的每个成员都进行了添加到 members的调用-它不是基于JSON中的内容。 (对于那些感兴趣的人, visitFieldsReflectively中的 ReflectingFieldNavigator方法将填充成员。)

因此,我认为混淆是围绕“如果没有这样的成员存在”子句中“成员”的含义。根据代码,我认为JavaDoc的作者引用的是Java类中定义的成员。对于像我一样的Gson API临时用户,我认为“成员”是指JSON中的对象元素。

现在,这个问题清楚了吗?

====

根据问题的快速阅读而得出的第一个答案(保留有用的链接):
null引用不是 JsonNull值。 (value == null)value.isJsonNull()不同。他们有很大的不同。

文档描述到对 JsonObject.get(String) 的调用返回“[n] ull,如果不存在这样的成员”。他们没有说返回 JsonNull

调用 JsonElement.isJsonNull()不会检查 JsonElement引用是否是 null引用。实际上,如果它是 null引用,则对其调用方法将抛出 NullPointerException。它正在检查它是否是 JsonNull 实例。

关于json - GSON:.isJsonNull()问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com