使用Jackson从含数组的JSON对象提取id与attributes映射
问题解决:Jackson反序列化嵌套JSON结构报错
错误原因
你的JSON根结构是一个对象(外层为{}),真正的求职者数组在data字段中,但你直接将整个JSON反序列化成ArrayList<JobSeeker>,Jackson预期读取数组开头的[,实际却读到对象开头的{,因此抛出类型不匹配的异常。
解决方案
方案1:创建外层响应包装类
定义一个对应整个JSON结构的包装类,通过它提取data数组:
// 外层响应类 public class JobSeekerResponse { private List<JobSeeker> data; // getter和setter public List<JobSeeker> getData() { return data; } public void setData(List<JobSeeker> data) { this.data = data; } } // 求职者实体类(仅保留需要的字段) public class JobSeeker { private String id; private Map<String, Object> attributes; // 若attributes结构固定,可替换为对应实体类 // getter和setter public String getId() { return id; } public void setId(String id) { this.id = id; } public Map<String, Object> getAttributes() { return attributes; } public void setAttributes(Map<String, Object> attributes) { this.attributes = attributes; } // 可选:重写toString方便打印结果 @Override public String toString() { return "JobSeeker{id='" + id + "', attributes=" + attributes + '}'; } }
修改反序列化代码:
ObjectMapper objectMapper = new ObjectMapper(); JobSeekerResponse response = objectMapper.readValue(EntityUtils.toString(entity), JobSeekerResponse.class); List<JobSeeker> myObjects = response.getData(); for (JobSeeker itr : myObjects) { System.out.println(itr); }
方案2:直接操作JSON节点(无需额外类)
如果不想创建包装类,可以通过Jackson的JsonNode直接提取目标数组:
ObjectMapper objectMapper = new ObjectMapper(); // 先读取整个JSON为节点 JsonNode rootNode = objectMapper.readTree(EntityUtils.toString(entity)); // 获取data字段对应的数组节点 JsonNode dataNode = rootNode.get("data"); // 将数组节点转换为List<JobSeeker> List<JobSeeker> myObjects = objectMapper.convertValue(dataNode, new TypeReference<List<JobSeeker>>(){}); for (JobSeeker itr : myObjects) { System.out.println(itr); }
注意事项
- 确保
JobSeeker类的字段名与JSON中的id、attributes完全匹配,或通过@JsonProperty注解指定映射关系(若字段名不一致)。 - Jackson默认会忽略JSON中未在实体类定义的字段(如
type、relationships),无需额外配置。
内容的提问来源于stack exchange,提问作者trilogy
相关产品推荐
相关产品推荐

