2012-03-09 75 views
1

我想反序列化一些JSON中獲得的布爾值。問題是這些值可能爲空,真,假,「真」,假,「Y」或「N」。Jackson反序列化自定義布爾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); 
    } 

但是,如果我把它註冊爲這本解串器不會被調用:

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

如果,另一方面,我用@JsonDeserialize(using = CustomBooleanDeserializer.class)對於布爾字段,它確實被調用並且工作得很好。唯一的問題是,如果屬性爲null,我得到這個異常:

org.codehaus.jackson.map.JsonMappingException:問題解串 財產「show_query_cond」(預計類型:簡單類型,類 布爾];實際類型:[NULL]),提出問題:對於場 無效值(通過參考鏈:com.csf.model.CSTable [ 「show_query_cond」])

所以,如果布爾屬性爲空,我的反序列化器沒有機會運行。另外,我嘗試使用mapper.configure(DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES, false);,但如果使用@JsonDeserialize註釋,則仍會拋出異常。

有誰知道如何使這項工作?

回答

7

至於註冊,這可能是由於Java同時具有原始的boolean和對象封裝器Boolean。所以你需要使用java.lang.BooleanBoolean.TYPE來登記 - 後者是原始類型的佔位符類。

空處理是不同的問題:反序列化方法不會被他們調用。但是,有方法

JsonDeserializer.getNullValue() 

應該被調用;對於原語,您必須返回'Boolean.FALSE',因爲您不能將null分配給原始值(可以返回包裝;它可以正確處理)。

2

在您的自定義解串器,您可以覆蓋的方法getNullValue到默認值:

之前2.6

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

2.6+

@Override 
public Boolean getNullValue(DeserializationContext ctxt) { 
    return Boolean.FALSE; 
} 
相關問題