Джексон игнорирует десериализатор настраиваемого поля, когда значение равно нулю

Я написал специальный десериализатор для Джексона для определенной области (следует). Я использую это с этой аннотацией:

@JsonDeserialize(using = TokenTypeDeserializer.class)
TokenType type;

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

Как я могу заставить его пройти через мой пользовательский десериализатор, когда значение null?

Это пользовательский десериализатор, который я написал:

public static class TokenTypeDeserializer extends StdDeserializer<TokenType> {

    public TokenTypeDeserializer() {
        this(null);
    }

    protected TokenTypeDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public TokenType deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectCodec oc = p.getCodec();
        JsonNode node = oc.readTree(p);
        String type = node.asText();

        TokenType tokenType = TokenType.getTokenTypeFromString(type);
        return tokenType;
    }
}

Я немного заглянул в код ObjectMapper и увидел это:

public final Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
    JsonToken t = jp.getCurrentToken();
    if (t == JsonToken.VALUE_NULL) {
        return (_nullProvider == null) ? null : _nullProvider.nullValue(ctxt);
    }
    if (_valueTypeDeserializer != null) {
        return _valueDeserializer.deserializeWithType(jp, ctxt, _valueTypeDeserializer);
    }
    return _valueDeserializer.deserialize(jp, ctxt);
}

Кажется, что ObjectMapper сначала проверяет, является ли значение нулевым, и, если это так, возвращает значение по умолчанию. Любые идеи о том, как заставить его пройти через мой десериализатор?

1 ответ

Решение

Согласно этому обсуждению, похоже, что вы не можете предоставить альтернативу для нуля, если это не примитивный тип (который не может быть пустым).

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

Другие вопросы по тегам