当值为 "null" 时,Jackson 忽略自定义字段反序列化器
Jackson Ignores Custom Field Deserializer When Value is "null"
我为 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,如果是,returns 默认值。关于如何强制它通过我的反序列化器的任何想法?
根据此 discussion,看起来您无法为 null 提供替代方法,除非它是基本类型(不能为 null)。
总而言之,这是一种常见的行为,如果您将空值反序列化为可为空的类型,那么空值就是您应该得到的值。
我为 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,如果是,returns 默认值。关于如何强制它通过我的反序列化器的任何想法?
根据此 discussion,看起来您无法为 null 提供替代方法,除非它是基本类型(不能为 null)。
总而言之,这是一种常见的行为,如果您将空值反序列化为可为空的类型,那么空值就是您应该得到的值。