Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止Jackson中的自动字符串到整数转换_Java_Json_Jackson - Fatal编程技术网

Java 防止Jackson中的自动字符串到整数转换

Java 防止Jackson中的自动字符串到整数转换,java,json,jackson,Java,Json,Jackson,我有一个简单的POJO: public class ADate { private Integer day; private Integer month; private Integer year; ... // getters/setters/constructor } 以下JSON文档被正确反序列化为ADate: { "day":"10", "month":"2", "year":"1972" } Jackson自动将字符串转换为整数 如

我有一个简单的POJO:

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

{ 
  "day":"10", 
  "month":"2", 
  "year":"1972"
}
Jackson自动将字符串转换为整数


如果整数值被定义为字符串,有没有办法避免这种自动转换并使Jackson失败。

我在Jackson github上找到了一些有趣的代码。稍微改变一下,这就是我得到的:

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();
    }
}
公共类ForceIntegerDeserializer扩展JsonDeserializer{
@凌驾
公共int反序列化(JsonParser JsonParser,DeserializationContext DeserializationContext)引发IOException{
if(jsonParser.getCurrentToken()!=JsonToken.VALUE\u NUMBER\u INT){
抛出deserializationContext.ErrorTokenException(jsonParser,JsonToken.VALUE_STRING,“试图将字符串解析为int,但这是禁止的”);
}
返回jsonParser.getValueAsInt();
}
}

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

确切用法示例:

objectMapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);
参考资料:

[1] 添加
MapperFeature.ALLOW_concurvation_OF_SCALARS
以启用/禁用强制#1106:

[2] 如果
反序列化功能,防止将
int
从空字符串强制为
null
。原语的
true
\1095:


[3] 允许\u强制\u的\u标量

我有点困惑,您是否希望整数作为字符串?在任何情况下,映射器中都有这样的配置:
ObjectMapper mapper=new ObjectMapper();configure(JsonGenerator.Feature.WRITE_NUMBERS_为_字符串,true)
或false,如果您不想使用它,因为设置似乎没有任何区别。基本上,我不希望系统接受以字符串代替数字的文档。您是否解决了问题?我面临着同样的行为,无法找到配置来禁用此功能。您能告诉我将此文件放在何处以及如何将其用于我的Spring boot项目吗?@AbhisekRoy将其放在组件扫描中的任意位置,并使用JsonComponent注释,然后添加注释以对模型中的每个变量使用它吗?