如何忽略JSON外层包装直接解析出Employee列表?
问题:Jackson注解忽略JSON多层包装失败
我尝试用@JsonTypeInfo等多种JSON注解跳过JSON的外层包装,但一直没成功。
原始JSON结构
{"header":{},"body":[{"data":{"emp":[{"name":"abc","address":""},{"name":"xyz","address":""}]}}],"statusCodeValue":200,"statusCode":"OK"}
期望结果
直接获取List<Employee>集合,元素格式如下:
{"name":"abc","address":""},{"name":"xyz","address":""}
现有Java类定义
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class Employee{ String name; String address; } @Data @JsonIgnoreProperties(ignoreUnknown=true) public class Employees{ @JsonProperty("emp") List<Employee> employees; }
当前尝试的代码
Map<String ,?> body=restTemplateResponse.getBody(); Object response=body.get("body"); // 返回ArrayList:[{data={emp=[{name=abc,address=null},{name=xyz,address=null}]}}] ObjectMapper mapper=new ObjectMapper(); mapper.convertValue(response, new TypedReference<>(){});
解决方案
方法1:用JsonPath直接提取(最简)
借助Spring的JsonPath工具,直接定位到目标数组路径$.body[0].data.emp,无需定义多余中间类:
// 先将响应转为JSON字符串 String responseJson = new ObjectMapper().writeValueAsString(restTemplateResponse.getBody()); // 提取emp数组并转为List<Employee> List<Employee> employees = JsonPath.read(responseJson, "$.body[0].data.emp");
方法2:定义完整响应类映射
通过定义匹配整个JSON结构的类,逐层解析后提取目标数据,可读性更强:
// 新增外层响应类 @Data @JsonIgnoreProperties(ignoreUnknown = true) public class ApiResponse { private List<BodyItem> body; } @Data @JsonIgnoreProperties(ignoreUnknown = true) public class BodyItem { private DataItem data; } @Data @JsonIgnoreProperties(ignoreUnknown = true) public class DataItem { @JsonProperty("emp") private List<Employee> employees; } // 转换并提取 ObjectMapper mapper = new ObjectMapper(); ApiResponse apiResponse = mapper.convertValue(restTemplateResponse.getBody(), ApiResponse.class); List<Employee> targetList = apiResponse.getBody().get(0).getData().getEmployees();
方法3:Jackson树模型遍历
利用Jackson的JsonNode树结构,手动遍历节点获取目标数组:
ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.valueToTree(restTemplateResponse.getBody()); // 逐层定位到emp数组 JsonNode empNode = rootNode.path("body").get(0).path("data").path("emp"); List<Employee> employees = mapper.convertValue(empNode, new TypeReference<List<Employee>>() {});
内容的提问来源于stack exchange,提问作者fiddle
相关产品推荐
相关产品推荐

