杰克逊在值为“null”时忽略自定义字段反序列化器

6

我为Jackson编写了一个自定义反序列化器,用于某个字段(如下所示)。我使用以下注释来调用它:

@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个回答

2
根据这个讨论,看起来除非是原始类型(不能为null),否则你无法提供null的替代方案。
总的来说,如果您将null值反序列化为可为空的类型,则应该在那里得到null值,这是一种常见行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接