本文详解如何将含content数组和pageable元数据的Spring Boot分页JSON响应,准确反序列化为Java DTO,避免MismatchedInputException异常,并支持灵活提取键值对。
本文详解如何将含`content`数组和`pageable`元数据的spring boot分页json响应,准确反序列化为java dto,避免`mismatchedinputexception`异常,并支持灵活提取键值对。
在Spring生态中,REST API常返回标准分页响应(如Page
根本原因在于:JSON中的"content"是一个JSON数组([ {...}, {...} ]),而原DTO中声明为private Map content,导致Jackson试图将数组反序列化为单个Map对象,类型严重不兼容。
✅ 正确做法:按JSON结构精准建模
方案一:使用泛型集合 + Map
适用于快速读取、无需强类型校验的场景(如仅需提取"Email"或"Name"等特定字段):
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.springframework.data.domain.Pageable;
@Data
public class OtherResponse {
@JsonProperty("content")
private List<Map<String, String>> content; // ✅ 匹配 JSON 数组中的每个对象为 Map
private Pageable pageable;
}调用示例:
ObjectMapper mapper = new ObjectMapper();
OtherResponse response = mapper.readValue(jsonString, OtherResponse.class);
// 安全提取第一个元素的 Email(注意 HTML 标签需清洗)
if (!response.getContent().isEmpty()) {
String emailHtml = response.getContent().get(0).get("Email");
String cleanEmail = Jsoup.parse(emailHtml).text(); // 推荐用 Jsoup 清洗 <a> 标签
System.out.println("Email: " + cleanEmail); // 输出: [email protected]
}⚠️ 注意:原始JSON中Email字段值是带HTML 标签的字符串(含Cloudflare邮箱混淆),不可直接作为邮箱使用。务必在业务层做HTML解析或正则清洗。
方案二:定义强类型实体类(推荐)
提升可维护性、IDE支持与类型安全,尤其当content内对象结构稳定时:
@Data
public class Person {
private Long id;
private String reg;
@JsonProperty("Email")
private String email; // 字段名可自定义,@JsonProperty 映射原始键
@JsonProperty("Mobile")
private String mobile;
@JsonProperty("Name")
private String name;
@JsonProperty("Ip")
private String ip;
@JsonProperty("Datetime")
private LocalDateTime datetime; // 需配合 @JsonFormat 或 JavaTimeModule
}
@Data
public class OtherResponse {
@JsonProperty("content")
private List<Person> content;
private Pageable pageable;
private boolean last;
private int totalPages;
private long totalElements;
private boolean first;
private int numberOfElements;
private int size;
private int number;
private boolean empty;
}? 提示:若Datetime字段需反序列化为LocalDateTime,请确保已注册JavaTimeModule:
ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule());
? 关键注意事项总结
-
永远先看JSON结构再写DTO:content是数组 → DTO中必须是List
,而非Map或Object; - @JsonProperty仅用于键名映射,不改变数据结构层级;
- Pageable是接口,Jackson默认可反序列化其标准实现(如PageRequest),无需额外配置;
- 若只需部分字段(如仅id+name),可创建精简DTO,避免过度建模;
- 对含HTML/编码内容(如)的字段,必须在反序列化后清洗,不可直接信任。
通过结构一致的DTO设计,即可稳定、高效地完成JSON到领域对象的转换,并为后续业务逻辑提供清晰、安全的数据入口。


















