ObjectMapper解析JSON时日期字段lastDefaultDate返回null问题
问题解决:JSON转对象时lastDefaultDate字段为null的原因及修复方案
核心原因
出现这个问题有两个关键因素:
- 字段命名不匹配:JSON中的键是
LastDefaultDate(PascalCase格式),而类中对应的字段是lastDefaultDate(camelCase格式),默认的JSON序列化/反序列化规则无法自动映射这两种命名格式。 - 日期格式不兼容:JSON里的日期字符串是
"1915-04-14 00:00:00",而Jackson(假设你用的是这个库)默认的日期解析格式不支持这种带空格分隔的日期时间格式,导致无法将字符串转换为Date对象,最终赋值为null。
修复方案
方案一:字段级注解配置(推荐)
直接在类的字段上添加注解,明确指定JSON键名和日期格式:
@Data @JsonIgnoreProperties({"document"}) public class RiskClass implements KeyedObject { @JsonProperty("Risk") String risk; @JsonProperty("Classification") String classification; @JsonProperty("LastDefaultDate") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 时区按需调整 Date lastDefaultDate; @Override public String getKey() { return risk; } }
@JsonProperty:指定当前字段对应的JSON键名,解决大小写命名不匹配问题。@JsonFormat:明确日期字符串的解析格式,让JSON库能正确将字符串转为Date对象。
方案二:全局配置JSON解析规则
如果项目中有大量类似命名格式的类,可以全局配置Jackson的解析规则,避免逐个字段加注解:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 自动将JSON的PascalCase键名转为类的camelCase字段名 objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE_TO_LOWER_CAMEL_CASE); // 设置全局日期解析格式 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); return objectMapper; } }
这种方式下,RiskClass可以保持原有代码结构,无需添加字段级注解。
验证
修改后重新执行JSON转对象的代码,lastDefaultDate字段就能正确读取JSON中的日期值,不会再为null。
内容的提问来源于stack exchange,提问作者Aditya Sethi
相关产品推荐
相关产品推荐

