如何配置Jackson禁止通过枚举序号进行反序列化?
问题:Jackson枚举反序列化允许序号匹配的问题
在Spring中使用Jackson(3.1.x版本首次发现该行为)时遇到枚举反序列化问题:希望仅允许通过枚举中指定的字符串值(01、02、03)进行反序列化,禁止使用枚举序号。但当前输入"{\"value\": \"1\"}"本应反序列化失败,却被解析为SECOND枚举值,询问是否有对应配置选项。
代码示例
fun main(args: Array<String>) { val objectMapper = ObjectMapper().registerKotlinModule() println(objectMapper.readValue("{ \"value\": \"01\" }}", TestClass::class.java)) println(objectMapper.readValue("{ \"value\": \"1\" }}", TestClass::class.java)) // 此处应反序列化失败 } data class TestClass(val value: TestEnum) enum class TestEnum(@JsonValue val value: String) { FIRST("01"), SECOND("02"), THIRD("03") }
输出结果
TestClass(value=FIRST) TestClass(value=SECOND)
使用依赖
implementation "com.fasterxml.jackson.core:jackson-core:2.15.2" implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2'
解决方案
方法1:配置ObjectMapper禁用枚举序号反序列化
Jackson默认允许通过枚举的序号(ordinal)反序列化,只需启用DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS特性,即可禁止该行为,让反序列化仅识别枚举@JsonValue指定的字符串值:
val objectMapper = ObjectMapper() .registerKotlinModule() .enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS)
配置后,输入"1"这类字符串形式的数字会触发JsonMappingException,反序列化失败,符合预期。
方法2:自定义@JsonCreator实现严格匹配
如果需要更精细的控制,可以在枚举类中添加@JsonCreator方法,仅匹配指定的字符串值:
enum class TestEnum(@JsonValue val value: String) { FIRST("01"), SECOND("02"), THIRD("03"); @JsonCreator companion object { @JvmStatic fun fromValue(value: String): TestEnum { return entries.firstOrNull { it.value == value } ?: throw IllegalArgumentException("无效的枚举值: $value") } } }
这种方式下,只有完全匹配01、02、03的字符串能被解析,其他值(包括"1")都会抛出异常,实现严格匹配。
Spring环境全局配置
如果是Spring项目,想要全局生效,可以通过自定义ObjectMapper Bean实现:
@Configuration class JacksonConfig { @Bean fun objectMapper(): ObjectMapper { return ObjectMapper() .registerKotlinModule() .enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS) } }
配置后,所有枚举的反序列化都会遵循规则,禁止通过序号匹配。
内容的提问来源于stack exchange,提问作者anstue
相关产品推荐
相关产品推荐

