当值为“null”时,Jackson忽略自定义字段反序列化器

时间:2017-07-09 08:08:05

标签: java json jackson deserialization objectmapper

我为杰克逊为某个领域编写了一个自定义反序列化程序(如下)。我在这个注释中使用它:

@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首先检查该值是否为null,如果是这样,则返回默认值。关于如何强制它通过我的解串器的任何想法?

1 个答案:

答案 0 :(得分:2)

根据这个discussion,看起来你不能为null提供替代,除非它是一个原始类型(它不能为空)。

总而言之,这是一种常见的行为,如果要将空值反序列化为可空类型,则null是您应该到达的值。