
当json字段名(如"lastdefaultdate")与java pojo字段名(如lastdefaultdate)大小写不匹配时,jackson默认无法自动绑定,导致字段反序列化为null,需通过@jsonproperty显式映射或统一命名规范解决。
在使用Jackson的ObjectMapper进行JSON反序列化时,字段名称的大小写敏感性是导致null值的常见原因。你提供的JSON数据中,日期字段名为 "LastDefaultDate"(驼峰大写开头),而Java类中对应字段为 lastDefaultDate(标准小驼峰)。由于Jackson默认采用按字段名精确匹配策略(且区分大小写),它无法将 "LastDefaultDate" 自动映射到 lastDefaultDate,因此该字段被跳过,最终保持默认值 null。
✅ 正确做法:使用 @JsonProperty 显式声明映射关系
修改你的 RiskClass 类,为每个字段添加 @JsonProperty 注解,明确指定其对应的JSON键名:
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Date;
@Data
@JsonIgnoreProperties({"document"})
public class RiskClass implements KeyedObject {
@JsonProperty("Risk")
private String risk;
@JsonProperty("Classification")
private String classification;
@JsonProperty("LastDefaultDate")
private Date lastDefaultDate;
@Override
public String getKey() {
return risk;
}
}? 注意:@JsonProperty 的值必须严格匹配JSON中的字段名(包括大小写和下划线等),例如 "LastDefaultDate" 不能写成 "lastDefaultDate" 或 "last_default_date"。
⚠️ 补充说明:日期格式问题也不容忽视
虽然本例主因是字段名不匹配,但还需确保 Date 类型能正确解析 "1915-04-14 00:00:00" 这类字符串。Jackson 默认不支持含空格的 yyyy-MM-dd HH:mm:ss 格式。建议增强配置:
ObjectMapper mapper = new ObjectMapper();
// 注册JavaTime模块(推荐使用LocalDateTime替代Date)
mapper.registerModule(new JavaTimeModule());
// 或为Date类型指定解析格式(若必须用Date)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));同时,更现代、线程安全的做法是改用 LocalDateTime 并配合 @JsonFormat:
@JsonProperty("LastDefaultDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastDefaultDate;✅ 验证示例(完整测试片段)
String json = "[{\"Risk\":\"BN\",\"Classification\":null,\"LastDefaultDate\":\"1915-04-14 00:00:00\"}]";
List list = mapper.readValue(json, new TypeReference>() {});
System.out.println(list.get(0).getLastDefaultDate()); // 输出:Sun Apr 14 00:00:00 CST 1915(Date)或 1915-04-14T00:00(LocalDateTime)
? 总结
- ❌ 不要依赖字段名自动推导(尤其JSON由外部系统生成时,命名风格常不一致);
- ✅ 始终为关键字段显式添加 @JsonProperty;
- ✅ 优先使用 LocalDateTime + @JsonFormat 替代 Date,避免时区与线程安全问题;
- ✅ 启用 FAIL_ON_UNKNOWN_PROPERTIES = false 可防止未知字段导致反序列化失败(调试阶段建议开启 true 快速暴露问题)。
遵循以上规范,即可彻底解决 lastDefaultDate 等字段反序列化为 null 的问题。










