2017-07-09 2 views
3

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?

Répondre

1

Selon ce discussion, il semble que vous ne pouvez pas fournir une alternative pour null sauf s'il s'agit d'un type primitif (qui ne peut pas être nul).

Dans l'ensemble, c'est un comportement courant, si vous désérialisez une valeur null dans un type nullable, null est la valeur que vous devriez y trouver.