JSON反序列化为Java对象后字段为空的问题排查与解决
反序列化JSON到Java对象时所有字段为null的问题排查与修复
问题根源
- JSON结构与目标类不匹配
服务器返回的JSON外层是包含reports数组的对象,但你直接将整个JSON反序列化为单个ReportDataFromReporter对象。顶层结构完全不对应,Jackson无法找到匹配字段,导致所有字段为null。 - 字段名称不匹配
实体类字段名和JSON中的键名完全错位:- 实体
day→ JSONdate - 实体
hours→ JSONhour - 实体
description→ JSONtext - 实体
project→ JSONpro - 实体
taskType→ JSONtask
- 实体
- 日期格式配置冲突
你同时配置了JavaTimeModule和SimpleDateFormat,二者逻辑冲突;且JSON中的日期是带时区的格式(2023-03-15T00:00:00+03:00),SimpleDateFormat无法正确解析该格式。
修复步骤
1. 创建顶层响应类匹配JSON结构
定义一个包含reports数组的顶层类,用来接收完整的JSON响应:
@Data public class ReporterResponse { private List<ReportDataFromReporter> reports; }
2. 修正实体类的字段映射与日期配置
用@JsonProperty指定JSON对应的键名,同时调整日期格式化规则以适配带时区的格式:
@Data public class ReportDataFromReporter { private Long id; @JsonProperty("date") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX") private LocalDate day; @JsonProperty("hour") private Integer hours; @JsonProperty("text") private String description; @JsonProperty("pro") private Long project; @JsonProperty("task") private Long taskType; private Long work_after; }
3. 调整反序列化代码逻辑
将反序列化目标改为顶层的ReporterResponse类,再从中取出需要的报表数据:
// 替换原有反序列化代码 ReporterResponse response = objectMapper.readValue(reporterResponse, ReporterResponse.class); List<ReportDataFromReporter> reportList = response.getReports(); // 根据业务需求返回数据,示例返回列表首个元素(可根据实际修改返回类型为List) return reportList.isEmpty() ? null : reportList.get(0);
4. 修复ObjectMapper的日期配置
移除冲突的SimpleDateFormat配置,仅保留JavaTimeModule即可正确处理Java 8日期类型:
ObjectMapper objectMapper = new ObjectMapper() .registerModule(new JavaTimeModule()) .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 删除此行:objectMapper.setDateFormat(dateFormat);
内容的提问来源于stack exchange,提问作者Khaski
相关产品推荐
相关产品推荐

