J'ai écrit un désérialiseur personnalisé pour jackson pour un certain fichier (suit). Je l'utilise avec cette annotation:Jackson ignore désérialiseur personnalisé lorsque la valeur est "null"
@JsonDeserialize(using = TokenTypeDeserializer.class)
TokenType type;
Il semble fonctionner très bien, aussi longtemps que je passe une valeur dans le champ. Quand j'ai commencé à le tester, j'ai passé le champ avec null comme valeur. Dans ce cas, il a ignoré mon désérialisateur personnalisé, l'a ignoré et a simplement mis null comme valeur. C'est un problème parce que j'ai un mode d'action unique quand je suis nul dans ce domaine.
Comment puis-je le forcer à passer par mon désérialiseur personnalisé lorsque la valeur est null?
C'est désérialiseur personnalisé je l'ai écrit:
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;
}
}
Je regardai un peu dans le code ObjectMapper, et a vu ceci:
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);
}
Il semble que les premiers contrôles ObjectMapper si la valeur est nulle, et si tel est le cas, renvoie une valeur par défaut. Des idées sur la façon de le forcer à passer par mon désérialiseur?