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

Posted

技术标签:

【中文标题】当值为“null”时,Jackson 忽略自定义字段反序列化器【英文标题】:Jackson Ignores Custom Field Deserializer When Value is "null" 【发布时间】:2017-12-13 03:25:16 【问题描述】:

我为某个领域的 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 似乎首先检查该值是否为空,如果是,则返回默认值。关于如何强制它通过我的反序列化器的任何想法?

【问题讨论】:

【参考方案1】:

根据这个discussion,您似乎无法为 null 提供替代方案,除非它是原始类型(不能为 null)。

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

【讨论】:

以上是关于当值为“null”时,Jackson 忽略自定义字段反序列化器的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 序列化:忽略空值(或 null)

Jackson 序列化 - 忽略未设置的值,但提供明确设置为 null 的值

详解jackson注解(三)jackson包含属性、忽略属性的注解

Xcode 9:好奇的自定义字体行为

用于忽略自定义转义字符的正则表达式模式

Jackson忽略空字段