如何阻止Spring自动将JSON中的数字字符串转换为Double类型?
选择性控制Spring JSON类型转换方案
你需要的这种精准控制(允许字符串转Boolean/Integer,但阻止转Double)无法仅通过application.yml配置实现,因为Jackson没有提供单独的开关来区分整数和小数格式的字符串转换。不过可以通过自定义Jackson反序列化逻辑来达成需求,以下是具体实现方式:
方法一:自定义Object类型反序列化器
创建Spring配置类,自定义针对Object类型的反序列化规则,精准控制转换逻辑:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.io.IOException; @Configuration public class CustomJacksonConfig { @Bean public MappingJackson2HttpMessageConverter jacksonMessageConverter() { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule customModule = new SimpleModule(); // 给Object类型注册自定义反序列化器 customModule.addDeserializer(Object.class, new ObjectTypeDeserializer()); objectMapper.registerModule(customModule); return new MappingJackson2HttpMessageConverter(objectMapper); } static class ObjectTypeDeserializer extends JsonDeserializer<Object> { @Override public Object deserialize(JsonParser parser, DeserializationContext context) throws IOException { String rawValue = parser.getText(); // 优先处理布尔值转换 if ("true".equalsIgnoreCase(rawValue)) { return Boolean.TRUE; } if ("false".equalsIgnoreCase(rawValue)) { return Boolean.FALSE; } // 尝试转换为整数,失败则保留原字符串 try { return Integer.parseInt(rawValue); } catch (NumberFormatException ignored) { return rawValue; } } } }
逻辑说明
- 反序列化器会先判断字符串是否为布尔格式,是则转为
Boolean类型; - 再尝试将字符串转为
Integer,成功则返回,失败则直接返回原始字符串(包括"123.456"这类小数格式字符串); - 该配置会全局作用于所有
Map<String, Object>类型的JSON解析,完全符合你的需求。
方法二:结合全局配置与自定义规则(不推荐)
若想先通过yml关闭全局字符串转数值的特性,再手动处理需要的转换,可先在application.yml中添加:
spring: jackson: deserialization: accept-string-as-numeric-value: false
但此配置会同时阻止"123"转Integer,因此仍需额外添加上述自定义反序列化器来处理布尔和整数的转换,本质和方法一一致,步骤更繁琐,不推荐使用。
内容的提问来源于stack exchange,提问作者user1589188
相关产品推荐
相关产品推荐

