Jackson绑定Object.class的UntypedObjectDeserializer仅反序列化日期字符串问题
问题解答
核心规则
Jackson 反序列化器选择遵循最具体类型优先的匹配逻辑:
- 若反序列化目标字段明确声明为
String类型,Jackson 会直接匹配String.class对应的反序列化器(内置StringDeserializer或自定义的String类型反序列化器),不会触发绑定Object.class的反序列化器。 - 只有当目标字段的声明类型为
Object时,Jackson 才会调用你注册的CustomObjectDeserializer。
现象说明
你观察到的「仅日期类字符串会被CustomObjectDeserializer处理」,是因为示例 JSON 中只有value字段对应的 POJO 声明类型为Object,其余字段如field、operator、connector的声明类型均为String,自然不会进入Object类型反序列化器的执行逻辑,而非普通字符串无法被该反序列化器识别。
如果Object类型字段传入普通字符串,代码会尝试按日期格式解析失败后调用父类逻辑,直接将字符串作为String类型返回。
代码优化建议
SimpleDateFormat是线程不安全的,建议替换为线程安全的DateTimeFormatter,避免多线程场景下出现解析异常。- 你定义的日期格式
yyyy-MM-dd'T'HH:mm:ss.SSS未匹配输入末尾的Z时区标识,解析时会直接使用你设置的UTC时区处理,建议调整格式为yyyy-MM-dd'T'HH:mm:ss.SSSX兼容带Z的日期字符串。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

