Не берите в голову мой первый ответ ниже.Я бы прочитал вопрос слишком быстро.
Похоже, это простой случай, когда документы лживые - или, по крайней мере, их неправильно поняли.К счастью, код не так прост, и 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
выполняются для каждого члена, определенного в классе Java - он не основан на том, что находится в JSON.(Для интересующихся метод visitFieldsReflectively
в ReflectingFieldNavigator
заполняет члены.)
Итак, я полагаю, что путаница окружает значение «member» в предложении «если такого члена не существует».Основываясь на коде, я понял, что автор JavaDoc ссылался на член, определенный в классе Java.Для обычного пользователя API Gson - как и я - я предположил, что «member» ссылается на элемент объекта в JSON.
Теперь, ясна ли эта проблема?
====
Первый ответ основан на быстром чтении вопроса (сохраняется для полезных ссылок):
A null
ссылка не является значением JsonNull
.(value == null)
- это не то же самое, что value.isJsonNull()
.Они очень разные.
В документах описывается, что вызов JsonObject.get(String)
возвращает «[n] null, если такого члена не существует».Они не говорят, что возвращается JsonNull
.
Вызов JsonElement.isJsonNull()
не проверяет, является ли ссылка JsonElement
ссылкой null
.На самом деле, если бы это была ссылка null
, вызов метода для нее выкинул бы NullPointerException
.Он проверяет, является ли это JsonNull
экземпляром.