如何为指定字段配置Jackson强制转换规则而不影响其他字段?
仅对指定字段启用Jackson String到Double的强制转换
方法一:调整自定义反序列化器,手动处理字符串转换
全局禁用标量强制转换后,原反序列化器依赖的Jackson内置解析逻辑会触发错误,我们可以在反序列化器中手动判断并转换字符串值,绕过全局限制:
data class SeriesFrameInputChannel( @JsonDeserialize(using = StringToDoubleDeserializer::class) @JsonProperty("test_field") val testFieldForConvertion: Double ) class StringToDoubleDeserializer : StdDeserializer<Double>(Double::class.java) { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Double { return when (p.currentToken) { JsonToken.VALUE_STRING -> p.text.toDouble() else -> _parseDoublePrimitive(p, ctxt) } } }
该方案直接在反序列化器内实现字符串转Double的逻辑,仅对标注了该反序列化器的字段生效,不会影响全局其他字段。
方法二:使用@JsonCoercion注解(Jackson 2.12及以上版本)
Jackson 2.12+提供了@JsonCoercion注解,可直接为单个字段配置专属强制转换规则,无需修改全局配置:
import com.fasterxml.jackson.annotation.JsonCoercion import com.fasterxml.jackson.annotation.JsonCoercionInputShape import com.fasterxml.jackson.annotation.JsonCoercionAction data class SeriesFrameInputChannel( @JsonCoercion( inputShape = JsonCoercionInputShape.STRING, action = JsonCoercionAction.TRY_CONVERT ) @JsonProperty("test_field") val testFieldForConvertion: Double )
这个注解会覆盖全局Coercion配置,仅允许当前字段将字符串值强制转换为Double类型。
方法三:自定义模块针对字段配置Coercion
如果需要对多个字段统一配置,可创建自定义模块,在模块中针对特定字段设置规则:
class CustomCoercionModule : SimpleModule() { override fun setupModule(context: SetupContext) { super.setupModule(context) context.addBeanSerializerModifier(object : BeanSerializerModifier() { override fun modifyDeserializationConfig( config: DeserializationConfig, beanDesc: BeanDescription, configBuilder: DeserializationConfigBuilder ): DeserializationConfig { if (beanDesc.beanClass == SeriesFrameInputChannel::class.java) { val targetProperty = beanDesc.findProperty("testFieldForConvertion") targetProperty?.let { configBuilder.withAppendedAnnotation(it, JsonCoercion( inputShape = JsonCoercionInputShape.STRING, action = JsonCoercionAction.TRY_CONVERT )) } } return configBuilder.build() } }) } } // 注册模块到ObjectMapper val objectMapper = ObjectMapper().apply { configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false) registerModule(CustomCoercionModule()) }
该方案适合批量配置场景,单个字段需求下方法一或方法二更简洁。
内容的提问来源于stack exchange,提问作者user3856196
相关产品推荐
相关产品推荐

