Jackson反序列化自定义布尔json属性
我想反序列化JSON中的一些布尔值。问题是这些值可以是null、true、false、“true”、false、“Y”或“N” 我已经创建了自己的布尔反序列化程序Jackson反序列化自定义布尔json属性,json,boolean,jackson,Json,Boolean,Jackson,我想反序列化JSON中的一些布尔值。问题是这些值可以是null、true、false、“true”、false、“Y”或“N” 我已经创建了自己的布尔反序列化程序 public class CustomBooleanDeserializer extends JsonDeserializer<Boolean> { final protected Class<?> _valueClass = Boolean.class; @Override pub
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)
,它确实会被调用,并且工作得很好。唯一的问题是,如果属性为null,则会出现以下异常:
org.codehaus.jackson.map.JsonMappingException:反序列化问题
属性“show\u query\u cond”(预期类型:[简单类型,类
boolean];实际类型:[NULL]),问题:字段的值无效
(通过引用链:com.csf.model.CSTable[“show\u query\u cond”])
因此,如果布尔属性为null,我的反序列化程序就没有机会运行。此外,我还尝试使用mapper.configure(反序列化config.Feature.FAIL_ON_NULL_FOR_PRIMITIVES,false)但是如果我使用@JsonDeserialize注释,仍然会引发异常
有人知道如何做到这一点吗?至于注册,这可能是因为Java既有原语boolean
又有对象包装boolean
。因此,您需要同时使用java.lang.Boolean
和Boolean.TYPE
——后者是基元类型的占位符类
空处理是另一个问题:不为它们调用反序列化方法。然而,有一种方法
JsonDeserializer.getNullValue()
应该称之为;对于原语,您必须返回“Boolean.FALSE”,因为您不能将null赋值给原语值(返回wrapped是可以的,它会得到正确处理)。在自定义反序列化程序中,您可以将getNullValue方法重写为默认值:
2.6之前
@Override
public Boolean getNullValue() {
return Boolean.FALSE;
}
2.6+
@Override
public Boolean getNullValue() {
return Boolean.FALSE;
}
@Override
public Boolean getNullValue(DeserializationContext ctxt) {
return Boolean.FALSE;
}