You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何忽略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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:50:16