阻止Jackson中的自动String to Integer转换

时间:2016-09-20 15:13:37

标签: java json jackson

我有一个简单的POJO:

myLookupItemReader

以下JSON文档被正确反序列化为public class ADate { private Integer day; private Integer month; private Integer year; ... // getters/setters/constructor }

ADate

杰克逊自动将字符串转换为整数。

有没有办法避免这种自动转换,如果将Integer值定义为String,则让Jackson失败。

2 个答案:

答案 0 :(得分:1)

我在Jackson github issues找到了一些有趣的代码。改变了一点,这就是我得到的:

public class ForceIntegerDeserializer extends JsonDeserializer<Integer> {

    @Override
    public int deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        if (jsonParser.getCurrentToken() != JsonToken.VALUE_NUMBER_INT) {
            throw deserializationContext.wrongTokenException(jsonParser, JsonToken.VALUE_STRING, "Attempted to parse String to int but this is forbidden");
        }
        return jsonParser.getValueAsInt();
    }
}

答案 1 :(得分:1)

在ObjectMapper上有一个名为MapperFeature.ALLOW_COERCION_OF_SCALARS的配置设置。如果设置为false,它将防止ObjectMapper将数字和布尔值的字符串表示形式强制转换为Java对应形式。仅允许严格的转换。

确切的用法示例:

objectMapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);

参考文献:

[1] 添加MapperFeature.ALLOW_COERCION_OF_SCALARS以启用/禁用强制#1106 https://github.com/FasterXML/jackson-databind/issues/1106

[2] 如果intnull#1095,则可以防止DeserializationFeature .FAIL_ON_NULL_FOR_PRIMITIVES从空字符串强制转换为true#1095: https://github.com/FasterXML/jackson-databind/issues/1095

[3] ALLOW_COERCION_OF_SCALARS http://fasterxml.github.io/jackson-databind/javadoc/2.9/