使用Jackson注解将JSON列表反序列化为自定义包装类
解决方法:用Jackson注解将JSON数组反序列化为包装类
这个需求其实挺常见的,Jackson给了很简洁的实现方式,我给你两种实用的方案:
方案一:通过带@JsonCreator注解的构造方法实现
这是最直接的方式,让Jackson把整个JSON数组当作构造参数,直接赋值给包装类的items属性:
首先定义你的MyClass(确保它能被Jackson正常序列化/反序列化,一般只要有Getter/Setter或者默认构造方法就行):
public class MyClass { private String name; // 你的其他字段 // Getter和Setter public String getName() { return name; } public void setName(String name) { this.name = name; } }
然后定义MyWrapper类,给接收List<MyClass>的构造方法加上@JsonCreator注解:
public class MyWrapper { private List<MyClass> items; // 用@JsonCreator告诉Jackson:这个构造方法用来处理JSON数组 @JsonCreator public MyWrapper(List<MyClass> items) { this.items = items; } // Getter和Setter public List<MyClass> getItems() { return items; } public void setItems(List<MyClass> items) { this.items = items; } }
最后反序列化的代码就和平时一样:
ObjectMapper mapper = new ObjectMapper(); // 假设你的JSON是这样的数组格式 String jsonArray = "[{\"name\":\"张三\"},{\"name\":\"李四\"}]"; MyWrapper wrapper = mapper.readValue(jsonArray, MyWrapper.class);
方案二:通过静态工厂方法+@JsonCreator实现
如果你不想修改类的构造方法(比如已有其他构造逻辑),可以用静态工厂方法来包装:
public class MyWrapper { private List<MyClass> items; // 保留默认构造方法 public MyWrapper() {} // 静态工厂方法,用@JsonCreator标记为反序列化入口 @JsonCreator public static MyWrapper fromList(List<MyClass> items) { MyWrapper wrapper = new MyWrapper(); wrapper.setItems(items); return wrapper; } // Getter和Setter public List<MyClass> getItems() { return items; } public void setItems(List<MyClass> items) { this.items = items; } }
这种方式和方案一效果完全一样,只是更灵活,适合已有复杂构造逻辑的场景。
注意事项
- 确保你的
MyClass符合Jackson的序列化要求:要么有默认无参构造方法,要么给构造方法加@JsonCreator和@JsonProperty注解(如果是带参构造)。 - 如果你用的是Jackson 2.x以上版本,这些注解都在
com.fasterxml.jackson.annotation包下,记得引入对应的依赖。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

