2017-07-09 15 views
3

私は特定のフィールド(以下)の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最初にチェックしているようですこの場合、デフォルト値を返します。私のデシリアライザを強制的に通過させる方法に関するアイデア?

答えて

1

このように、discussionでは、プリミティブ型(nullにはできません)でない限り、nullの代替を提供できないようです。

これはすべて共通の動作です。ヌル値をヌル可能型にデシリアライズする場合、nullはそこに到達する必要がある値です。

関連する問題