我有一个简单的POJO:
myLookupItemReader
以下JSON文档被正确反序列化为public class ADate {
private Integer day;
private Integer month;
private Integer year;
... // getters/setters/constructor
}
:
ADate
杰克逊自动将字符串转换为整数。
有没有办法避免这种自动转换,如果将Integer值定义为String,则让Jackson失败。
答案 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] 如果int
为null
#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/