You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:45:35