2012-03-09 20 views
1

JSONで取得したブール値の一部を逆シリアル化する必要があります。問題は、それらの値がnull、true、false、 "true"、false、 "Y"または "N"のいずれかである可能性があることです。ジャクソンカスタムブールjsonプロパティの逆シリアル化

私はこのようにそれを登録した場合

public class CustomBooleanDeserializer extends JsonDeserializer<Boolean> { 

    final protected Class<?> _valueClass = Boolean.class; 

    @Override 
    public Boolean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, 
      JsonProcessingException { 
     return _parseBooleanPrimitive2(jp, ctxt); 
    } 

    protected final boolean _parseBooleanPrimitive2(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException { 
     LogUtils.d("PARSE BOOLEAN"); 
     JsonToken t = jp.getCurrentToken(); 
     if (t == JsonToken.VALUE_TRUE) { 
      return true; 
     } 
     if (t == JsonToken.VALUE_FALSE) { 
      return false; 
     } 
     if (t == JsonToken.VALUE_NULL) { 
      return false; 
     } 
     if (t == JsonToken.VALUE_NUMBER_INT) { 
      return (jp.getIntValue() != 0); 
     } 
     if (t == JsonToken.VALUE_STRING) { 
      String text = jp.getText().trim(); 
      if ("true".equals(text)) { 
       return true; 
      } 
      if ("false".equals(text) || text.length() == 0) { 
       return Boolean.FALSE; 
      } 

      if ("N".equalsIgnoreCase(text) || text.length() == 0) { 
       return Boolean.FALSE; 
      } 

      if ("Y".equalsIgnoreCase(text)) { 
       return Boolean.TRUE; 
      } 
      throw ctxt.weirdStringException(_valueClass, "only \"true\" or \"false\" recognized"); 
     } 
     // Otherwise, no can do: 
     throw ctxt.mappingException(_valueClass); 
    } 

しかし、このデシリアライザが呼び出されることはありません自分のブールデシリアライザを作成しました:一方で、私は@JsonDeserialize(using = CustomBooleanDeserializer.class)を使用し、場合

Version version = new Version(1, 0, 0, "SNAPSHOT"); 
SimpleModule module = new SimpleModule("MyModuleName", version); 
module = module.addDeserializer(new CustomBooleanDeserializer()); 
objectMapper.registerModule(module); 

ブール値のフィールドの場合、呼び出され、うまく動作します。唯一の問題は、プロパティがnullの場合、私はこの例外を取得することです:

org.codehaus.jackson.map.JsonMappingException:問題 プロパティをデシリアライズ「show_query_cond」(予想タイプ:[単純型、クラス ブール];実際のタイプ:[NULL])、問題:フィールド に無効な値(基準チェーンを介し:com.csf.model.CSTable [ "show_query_cond"])

したがって、ブールプロパティがnullの場合、私のデシリアライザは動作する機会を得られません。また、私はmapper.configure(DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES, false);を使ってみましたが、@ JsonDeserializeアノテーションを使用すると例外がスローされます。

誰でもこの作業を行う方法を知っていますか?

答えて

7

登録に関しては、これはおそらくJavaがプリミティブbooleanとオブジェクトラッパーBooleanの両方を持つためです。したがって、java.lang.BooleanBoolean.TYPEの両方を使用して登録する必要があります。後者はプリミティブ型のプレースホルダクラスです。

Null処理は異なる問題です。デシリアライズメソッドは呼び出されません。ただし、呼び出されるメソッドはありません。

JsonDeserializer.getNullValue() 

プリミティブの場合、プリミティブ値にnullを代入することはできないので、単に 'Boolean.FALSE'を返さなければなりません(ラップされても正常に処理されます)。カスタムデシリアライザで

2

、あなたはデフォルト値に方法getNullValueを上書きすることができます。

2.6

@Override 
public Boolean getNullValue() { 
    return Boolean.FALSE; 
} 

2.6+

@Override 
public Boolean getNullValue(DeserializationContext ctxt) { 
    return Boolean.FALSE; 
} 
前に
関連する問題