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

解决Double类型枚举引发的JSON反序列化解析错误问题

问题解决方法

首先修正枚举类里的构造方法名称错误:原代码中构造方法写的是TaxBracket(Double value),但枚举类名是DoubleEnum,这会导致编译失败,先改成DoubleEnum(Double value)。

接下来解决JSON反序列化的核心问题:Spring默认的Jackson序列化规则是将枚举映射为其名称(如FIFTEEN_PERCENT),而你传入的是浮点数值,因此需要配置Jackson通过枚举的value属性来完成序列化/反序列化。

方案一:使用Jackson注解(推荐)

通过@JsonCreator和@JsonValue注解指定枚举的序列化/反序列化逻辑:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public enum DoubleEnum {
    ZERO_PERCENT(0.0),
    ONE_PERCENT(1.0),
    EIGHT_PERCENT(8.0),
    FIFTEEN_PERCENT(15.0),
    TWENTY_PERCENT(20.0);

    private final Double value;

    // 修正构造方法名称
    DoubleEnum(Double value) {
        this.value = value;
    }

    // 标注该方法的返回值作为枚举序列化后的输出
    @JsonValue
    public Double getValue() {
        return value;
    }

    // 标注该方法用于将输入的数值转换为枚举实例
    @JsonCreator
    public static DoubleEnum fromValue(Double value) {
        for (DoubleEnum doubleEnum : DoubleEnum.values()) {
            if (doubleEnum.value.equals(value)) {
                return doubleEnum;
            }
        }
        throw new IllegalArgumentException("Unknown value: " + value);
    }
}

注解说明

  • @JsonValue:告诉Jackson,当序列化枚举实例时,输出getValue()方法返回的Double值,而不是枚举的名称。
  • @JsonCreator:告诉Jackson,当反序列化DoubleEnum类型时,调用fromValue方法,将传入的浮点数值转换为对应的枚举实例。

方案二:自定义Spring Converter

如果项目中不依赖Jackson注解,也可以自定义类型转换器并注册到Spring容器:

  1. 实现转换器类:
import org.springframework.core.convert.converter.Converter;

public class DoubleEnumConverter implements Converter<Double, DoubleEnum> {
    @Override
    public DoubleEnum convert(Double source) {
        return DoubleEnum.fromValue(source);
    }
}
  1. 在Spring配置类中注册转换器:
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DoubleEnumConverter());
    }
}

这样Spring在处理请求参数或JSON体中的Double值时,会自动调用转换器转换为DoubleEnum实例。


内容的提问来源于stack exchange,提问作者personaly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:33:22