如何使用Jackson将JSON中的字符串形式数组反序列化为List<User>?
问题原因
原JSON中users字段的值是字符串格式的JSON数组(被双引号包裹,内部含转义字符),但Java实体类Group的users属性是List<User>类型,Jackson默认无法将字符串直接转换为集合对象,导致反序列化失败。
解决方法
方法一:自定义Jackson反序列化器
通过自定义反序列化逻辑,把users字段的字符串内容解析为List<User>:
- 编写自定义反序列化器:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; public class StringToListDeserializer extends JsonDeserializer<List<User>> { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public List<User> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 获取users字段的字符串值 String jsonStr = p.getText(); // 将字符串解析为List<User> return objectMapper.readValue(jsonStr, ctxt.getTypeFactory().constructCollectionType(List.class, User.class)); } }
- 在Group类的users字段上添加注解,指定使用该反序列化器:
static class Group { private String name; // 指定自定义反序列化器 @JsonDeserialize(using = StringToListDeserializer.class) private List<User> users; // 省略getter、setter、构造方法 }
- 正常执行原反序列化代码即可:
ObjectMapper objectMapper = new ObjectMapper(); Group group = objectMapper.readValue(s, Group.class);
方法二:通过中间对象中转
先将JSON反序列化为临时对象(把users字段定义为String类型),再手动解析字符串为List<User>:
- 定义中间类:
static class TempGroup { private String name; private String users; // 省略getter、setter }
- 分步完成反序列化与转换:
ObjectMapper objectMapper = new ObjectMapper(); // 先转成临时对象 TempGroup tempGroup = objectMapper.readValue(s, TempGroup.class); // 解析users字符串为List<User> List<User> userList = objectMapper.readValue(tempGroup.getUsers(), objectMapper.getTypeFactory().constructCollectionType(List.class, User.class)); // 构建最终的Group对象 Group group = new Group(); group.setName(tempGroup.getName()); group.setUsers(userList);
内容的提问来源于stack exchange,提问作者xz_
相关产品推荐
相关产品推荐

