我为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,如果是,则返回默认值。有什么办法可以强制它通过我的反序列化器吗?