Jackson JSON Mapper: нет поля или пустое поле?

Я использую Jackson JSON Mapper для анализа запросов на моем сервере.

например, я жду запроса, который соответствует классу My_class:

class My_class {
     String a;
     String b;
}

Я десериализую запросы таким образом:

public <T> T Deserialize(String json, Class<T> type) throws DeserializationException {
        if (json == null || type == null) {
            throw new IllegalArgumentException();
        }
        try {
            return objectMapper.readValue(json, type);
        } catch (JsonParseException e) {
            throw new DeserializationException(e);
        } catch (org.codehaus.jackson.map.JsonMappingException e) {
            throw new DeserializationException(e);
        } catch (IOException e) {
            throw new DeserializationException(e);
        }
    }

вот два примера запросов:

{"a":"test"}
{"a":"test", "b":null}

проблема в том, что я хочу знать, когда пользователь отправил мне запрос только с полем a и когда он отправил запрос с полем b значение null. Картограф отмечает поле b as null в обоих положения.

каков лучший способ сделать это (и избежать написания моего собственного десериализатора)?

1 ответов


вы можете использовать метод isNull() чтобы проверить, если JsonNode это null литерал.

boolean isNull()

метод, который можно использовать для проверки, был ли этот узел создан из значения null литерала JSON.

есть еще isMissingNode(), который, похоже, имеет аналогичную цель. Он должен возвращать true, если узел фактически не присутствует в документе JSON. Этот метод полезен, например, если вы хотите использовать значения по умолчанию для свойств, которые не заданы явно.

boolean isMissingNode()

метод, который возвращает true для "виртуальных" узлов, которые представляют отсутствующие записи, построенные методами доступа к пути, когда нет фактического соответствия узла заданным критериям.


на мой взгляд, вы должны избегать создания чего-то, что зависит от разницы между null и отсутствует узлы. Ты по сути, добавление какого-то дополнительного типа данных в десериализованный JSON: вместо просто null большинство API JSON возвращаются в обоих случаях, теперь у вас есть нулевой литерал и отсутствует узел что не является обычной практикой. Это сбивает с толку, и это может вызвать проблемы с вашим API, потому что клиенту нужно выполнить дополнительную работу, чтобы настроить его сериализатор для различения этих двух состояний. Возможно, что не все библиотеки JSON поддерживают это.