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

吉尔·沙格(Gil Shamgar)

我为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,如果是,则返回默认值。关于如何使其通过我的反序列化器的任何想法?

莫蒂·阿祖

根据本讨论,您似乎无法提供null的替代方法,除非它是原始类型(不能为null)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章