登录
首页 >  文章 >  java教程

JSON嵌套数组与分页映射技巧

时间:2026-05-31 14:12:54 211浏览 收藏

本文深入解析了Spring Boot分页JSON响应(含content数组和pageable元数据)在Java端的精准反序列化实践,直击因DTO结构与JSON不匹配导致的MismatchedInputException核心痛点,系统对比了灵活轻量的Map泛型方案与高可维护性的强类型实体类方案,并强调必须严格遵循“content是数组→DTO中必为List”的建模原则,同时涵盖HTML内容清洗、LocalDateTime反序列化配置等关键细节,助你稳定、安全、高效地打通前后端分页数据映射的最后一公里。

本文详解如何将含`content`数组和`pageable`元数据的Spring Boot分页JSON响应,准确反序列化为Java DTO,避免`MismatchedInputException`异常,并支持灵活提取键值对。

在Spring生态中,REST API常返回标准分页响应(如Page序列化结果),其结构包含content(实际数据列表)、pageable(分页配置)、totalElements等字段。若DTO定义与JSON结构不匹配——例如将数组类型的"content"字段错误声明为Map——Jackson会抛出MismatchedInputException,提示“Cannot deserialize value of type LinkedHashMap from Array value”。

根本原因在于: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());

? 关键注意事项总结

通过结构一致的DTO设计,即可稳定、高效地完成JSON到领域对象的转换,并为后续业务逻辑提供清晰、安全的数据入口。

好了,本文到此结束,带大家了解了《JSON嵌套数组与分页映射技巧》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>