GSON: .isJsonNull () вопрос - PullRequest
       10

GSON: .isJsonNull () вопрос

6 голосов
/ 06 июня 2011

Я читаю в файле JSON (используя Google GSON).Один из моих тестов проверяет поведение программы в файле событий, в котором отсутствует заданный ключ.

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

Я ожидаю, что когда .get (ing) этот ключ, я получу null.Оказывается, я делаю.Когда я .get(ENVIRONMENT), возвращаемое значение равно null.

Когда я проверяю его, я на самом деле получаю " not null ".Странно, учитывая, что Javadoc GSON говорит: « предоставляет проверку для проверки, представляет ли этот элемент нулевое значение или нет »

if (value.isJsonNull()) {
    System.out.println("null");
} else {
    System.out.println("not null");
}

Пожалуйста, помогите мне лучше понять это.

1 Ответ

14 голосов
/ 06 июня 2011

Не берите в голову мой первый ответ ниже.Я бы прочитал вопрос слишком быстро.

Похоже, это простой случай, когда документы лживые - или, по крайней мере, их неправильно поняли.К счастью, код не так прост, и 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 экземпляром.

...