I am reading in a JSON file (using Google's GSON
). One of my tests checks program's behavior in event file a given key is missing.
JsonElement value = e.getAsJsonObject().get(ENVIRONMENT);
My expectation is that when .get(ing) this key, i would get null
. Turns out i do. When i .get(ENVIRONMENT)
, value returned is null
.
When i test it, i actually get a "not null". Weird, considering, GSON's javadoc says "provides check for verifying if this element represents a null value or not"
if (value.isJsonNull()) {
System.out.println("null");
} else {
System.out.println("not null");
}
Please help me better understand this.
Never mind my first answer below. I'd read the question too quickly.
It looks like this is a simple case of the documents lying -- or at least being misunderstood. Fortunately, code does not lie so easily and Gson is an open source project.
Here's 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;
}
and here's where members
is populated:
/**
* 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);
}
Calls to add to members
are made for every member defined in the Java class -- it's not based on what's in the JSON. (For those interested, the visitFieldsReflectively
method in ReflectingFieldNavigator
populates members.)
So, I suppose the confusion is surrounding the meaning of "member" in the clause "if no such member exists". Based on the code, I gather that the author of the JavaDoc was referring to a member defined in the Java class. To the casual user of the Gson API -- like myself -- I assumed that "member" referred to an object element in the JSON.
Now, is this issue clear?
====
First answer based on quick read of question (retained for useful links):
A null
reference is not a JsonNull
value. (value == null)
is not the same as value.isJsonNull()
. They are very different.
The docs describe that the call to JsonObject.get(String)
returns "[n]ull if no such member exists." They do not say that JsonNull
is returned.
The call to JsonElement.isJsonNull()
is not checking whether the JsonElement
reference is a null
reference. In fact, if it were a null
reference, calling a method on it would throw a NullPointerException
. It's checking whether it's a JsonNull
instance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With