在Java项目里,Jackson是最常用的JSON处理库。当我们需要把一段JSON数组字符串反序列化成List<User>这样的泛型列表时,如果直接用objectMapper.readValue(json, List.class),得到的是List<LinkedHashMap>,元素并不是User对象。借助Jackson的TypeFactory,我们可以明确告知Jackson列表中的元素类型,从而正确完成反序列化。

为什么泛型列表反序列化会出问题
Java的泛型在编译期存在,运行期会被擦除。Jackson在运行时无法通过List.class得知列表里装的是什么类型,只能默认解析成Map结构。只有显式构造包含泛型参数的类型信息,Jackson才能按预期转换。
使用TypeFactory构造集合类型
TypeFactory是ObjectMapper内部用于创建JavaType的工厂。最常用的方法是constructCollectionType,它接收集合类和元素类两个参数,返回对应的JavaType。
基础示例代码
以下示例演示如何将JSON数组反序列化为List<User>:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import java.util.List;
public class Demo {
static class User {
public String name;
public int age;
}
public static void main(String[] args) throws Exception {
String json = "[{"name":"Tom","age":18},{"name":"Lucy","age":20}]";
ObjectMapper mapper = new ObjectMapper();
// 获取TypeFactory并构造List<User>类型
TypeFactory tf = mapper.getTypeFactory();
List<User> users = mapper.readValue(json, tf.constructCollectionType(List.class, User.class));
for (User u : users) {
System.out.println(u.name + " : " + u.age);
}
}
}
处理嵌套泛型结构
如果JSON结构是分页对象,里面包含data字段为List<User>,可以使用constructParametricType来构造嵌套类型。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import java.util.List;
public class PageDemo {
static class User { public String name; }
static class Page<T> { public List<T> data; }
public static void main(String[] args) throws Exception {
String json = "{"data":[{"name":"Tom"},{"name":"Lucy"}]}";
ObjectMapper mapper = new ObjectMapper();
TypeFactory tf = mapper.getTypeFactory();
// 构造Page<User>类型
var pageType = tf.constructParametricType(Page.class, User.class);
Page<User> page = mapper.readValue(json, pageType);
System.out.println(page.data.size());
}
}
小结
通过TypeFactory构造明确的JavaType,是解决Jackson泛型列表反序列化问题的标准做法。它不仅能处理单层List,也能应对嵌套的泛型对象,让代码在编译期和运行期都保持类型安全。
JacksonTypeFactory泛型列表反序列化修改时间:2026-07-29 06:48:16