私は特定のフィールド(以下)のjacksonのカスタムデシリアライザを作成しました。私はこの注釈でそれを使用します。Jacksonがカスタムのデシリアライザを無視する値が "null"の場合
@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最初にチェックしているようですこの場合、デフォルト値を返します。私のデシリアライザを強制的に通過させる方法に関するアイデア?