Jackson反序列化自定义布尔json属性

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

我想反序列化JSON中的一些布尔值。问题是这些值可以是null、true、false、“true”、false、“Y”或“N”

我已经创建了自己的布尔反序列化程序

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)

有人知道如何做到这一点吗?

至于注册,这可能是因为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;
}