You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jackson序列化Student对象触发JsonMappingException List转JSON失败问题

报错根因

这个报错本质上是两种可能性导致的:

  1. 泛型擦除隐藏了类型不匹配问题:findCourses方法实际返回的是List<List<String>>类型,你赋值给List<String>类型的courses字段时编译不会报错,Jackson序列化时读取到列表元素是集合类型,无法转为String序列化就抛出异常。
  2. Jackson版本过低,不支持JDK9及更高版本新增的ImmutableCollections系列不可变集合类型。

解决步骤

第一步:先确认类型匹配

在设置courses前临时加代码校验返回值类型:

List<String> courses = findCourses(student.getId());
// 打印每个元素的类型,排查是否是嵌套集合
courses.forEach(item -> System.out.println("元素类型:" + item.getClass().getName()));
student.setCourses(courses);

如果打印出来的元素类型是集合类,直接修改findCourses方法返回正确的List<String>即可解决问题。


第二步:处理不可变集合序列化问题

如果确认findCourses返回的是List<String>,只是元素/列表本身是JDK的不可变集合类型,可选择以下任意一种方案解决:

  • 方案1:升级Jackson版本
    Jackson从2.12版本开始原生支持JDK9+的不可变集合类型,将jackson-databind依赖升级到2.12.0及以上即可:
    <!-- Maven 依赖示例 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version>
    </dependency>
    
  • 方案2:转为普通ArrayList再赋值
    不需要修改依赖,赋值时转换为普通可变集合即可:
    student.setCourses(new ArrayList<>(findCourses(student.getId())));
    
  • 方案3:注册Jackson JDK模块
    初始化ObjectMapper时注册JDK类型支持模块:
    ObjectMapper jackson = new ObjectMapper()
        .registerModule(new Jdk8Module())
        .registerModule(new JavaTimeModule());
    

内容的提问来源于stack exchange,提问作者Buckzor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:36:07