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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:06:03