在Spring/Java中如何从对象数组提取acctId存入新数组
实现方案
前置注意点
你提供的JSON结构存在同层级重复
acctBasic键的问题,标准JSON解析器默认会覆盖前一个同键名的值,如需保留所有重复的acctBasic节点,需要提前调整Jackson反序列化配置;如果你的实际返回不存在重复acctBasic键,可删除后续示例中开启重复key解析的配置行。
Spring生态默认集成Jackson作为JSON序列化工具,无需额外引入依赖,以下是两种常用实现方案:
方案1:使用Jackson JsonNode直接解析(无需定义全量POJO)
适合临时处理该JSON结构,不需要写全套映射实体类,示例代码如下:
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; public class AcctIdExtractor { public List<String> extractAccountIds(String jsonPayload) throws JsonProcessingException { List<String> accountIds = new ArrayList<>(); ObjectMapper objectMapper = new ObjectMapper(); // 配置支持重复key解析为数组,解决示例JSON中重复acctBasic的问题,无重复key可删除本行 objectMapper.enable(DeserializationFeature.ACCEPT_MULTIPLE_VALUES_AS_ARRAY); JsonNode rootNode = objectMapper.readTree(jsonPayload); JsonNode acctSummArray = rootNode.path("acctSumm"); // 遍历acctSumm数组 for (JsonNode summItem : acctSummArray) { JsonNode acctBasicNodes = summItem.path("acctBasic"); // 兼容数组和单个节点两种情况 if (acctBasicNodes.isArray()) { for (JsonNode basicNode : acctBasicNodes) { String acctId = basicNode.path("acctId").asText(); accountIds.add(acctId); } } else { String acctId = acctBasicNodes.path("acctId").asText(); accountIds.add(acctId); } } // 如需转成String数组,调用 accountIds.toArray(new String[0]) 即可 return accountIds; } }
方案2:定义POJO反序列化后提取
如果需要长期处理该接口返回结构,建议定义映射实体类,代码可维护性更高:
第一步:定义实体类
import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; // 顶层返回结构,无Lombok可手动补全getter/setter @Data public class ApiResponse { private String code; private String message; // 不需要处理的字段可直接用JsonNode接收,也可定义对应实体类 private JsonNode recCtrlOut; private List<AcctSummItem> acctSumm; } // acctSumm数组元素 @Data public class AcctSummItem { // 映射acctBasic字段,重复key场景下用List接收 @JsonProperty("acctBasic") private List<AcctBasic> acctBasicList; } // acctBasic结构 @Data public class AcctBasic { private String acctType; private String acctId; }
第二步:提取acctId
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; public class AcctIdExtractor { public List<String> extractAccountIds(String jsonPayload) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); // 无重复acctBasic可删除本行配置 objectMapper.enable(DeserializationFeature.ACCEPT_MULTIPLE_VALUES_AS_ARRAY); ApiResponse response = objectMapper.readValue(jsonPayload, ApiResponse.class); // Stream流式提取所有acctId return response.getAcctSumm().stream() .flatMap(item -> item.getAcctBasicList().stream()) .map(AcctBasic::getAcctId) .toList(); } }
内容的提问来源于stack exchange,提问作者iamjoshua
相关产品推荐
相关产品推荐

