【问题标题】:Prevent automatic String to Integer conversion in Jackson防止杰克逊中的自动字符串到整数转换
【发布时间】:2016-09-20 15:13:37
【问题描述】:

我有一个简单的 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 自动将 String 转换为 Integer。

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

【问题讨论】:

  • 我有点困惑,你要不要将整数作为字符串?在任何情况下,映射器中都有一个配置:ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true); 如果您不希望它为字符串,则为 false
  • 设置似乎没有任何区别。基本上我不希望系统接受用字符串代替数字的文档
  • 你的问题解决了吗?我面临同样的行为,无法找到禁用此功能的配置..

标签: java json jackson


【解决方案1】:

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

具体用法示例:

objectMapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);

参考资料:

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

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

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

【讨论】:

    【解决方案2】:

    我在 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();
        }
    }
    

    【讨论】:

    • 你能告诉我把这个文件放在哪里以及如何在我的 Spring boot 项目中使用它吗?
    • @AbhisekRoy 使用 JsonComponent 注释将其放在组件扫描内的任何位置
    • 并添加注释以将其用于模型中的每个变量对吗?
    猜你喜欢
    • 2017-12-03
    • 2017-10-03
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多