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

Spring Boot嵌套JSON字符串映射POJO并提取指定字段值方案

动态嵌套JSON请求映射CRequestModel POJO实现方案

核心实现思路

由于入参JSON结构动态、CID字段位置和顺序不固定,不适合用固定层级的Java对象绑定反序列化,采用「原始字符串直接留存+Jackson递归遍历JSON树查找目标字段」的方案,完全适配结构动态变化的场景。

具体实现步骤

  • 保留现有Controller层@RequestBody接收String类型入参的逻辑,直接获取原始请求报文,避免反序列化过程修改原始JSON格式;
  • 基于Spring默认集成的Jackson做JSON树解析,递归遍历所有嵌套节点(支持对象、数组结构)查找CID字段,不依赖固定字段路径和顺序。

代码实现

1. 封装请求转换工具类

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.sql.Timestamp;
import java.util.Iterator;
import java.util.Map;

public class CRequestParser {
    // 复用ObjectMapper实例,避免重复创建
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static CRequestModel buildCRequestModel(String rawRequestStr) throws JsonProcessingException {
        CRequestModel requestModel = new CRequestModel();
        // 映射规则1:直接存储完整原始请求JSON字符串
        requestModel.setRequestJSON(rawRequestStr);
        requestModel.setCreatedAt(new Timestamp(System.currentTimeMillis()));

        // 解析为JSON树递归查找CID
        JsonNode rootNode = OBJECT_MAPPER.readTree(rawRequestStr);
        Integer cidValue = searchCidInNode(rootNode);
        requestModel.setCid(cidValue);

        return requestModel;
    }

    /**
     * 深度优先遍历所有JSON节点,查找key为CID的字段值
     * 支持任意嵌套深度、任意字段顺序、对象/数组混合结构
     */
    private static Integer searchCidInNode(JsonNode currentNode) {
        if (currentNode.isObject()) {
            Iterator<Map.Entry<String, JsonNode>> fieldIterator = currentNode.fields();
            while (fieldIterator.hasNext()) {
                Map.Entry<String, JsonNode> field = fieldIterator.next();
                // 匹配CID字段,如需忽略大小写可改为 field.getKey().equalsIgnoreCase("CID")
                if ("CID".equals(field.getKey())) {
                    return field.getValue().asInt();
                }
                // 递归遍历子节点
                Integer childCid = searchCidInNode(field.getValue());
                if (childCid != null) {
                    return childCid;
                }
            }
        } else if (currentNode.isArray()) {
            // 兼容数组结构遍历
            for (JsonNode arrayItem : currentNode) {
                Integer childCid = searchCidInNode(arrayItem);
                if (childCid != null) {
                    return childCid;
                }
            }
        }
        return null;
    }
}

2. Service层调用转换逻辑

现有Controller层代码无需修改,仅需在Service层处理入参时调用工具类完成映射即可:

import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.stereotype.Service;

@Service
public class CrdService {
    public crdResponse getDec(String rawRequest) throws JsonProcessingException {
        // 原始请求字符串映射为POJO
        CRequestModel requestModel = CRequestParser.buildCRequestModel(rawRequest);
        // 后续业务逻辑可直接使用requestModel的cid、requestJSON等字段
        // 原有业务逻辑保持不变
        return new crdResponse();
    }
}

方案特性

  • 完全满足映射规则:requestJSON字段1:1留存原始请求报文,不会因为JSON格式化、字段排序改变原始内容;
  • 结构兼容性强:无论后续JSON嵌套层级怎么调整、字段顺序怎么变化、是否新增数组结构,都能准确定位到CID字段;
  • 无额外依赖:使用SpringMVC默认内置的Jackson解析包,不需要引入第三方依赖;
  • 执行效率高:采用深度优先遍历,找到第一个CID字段后立刻终止遍历,无多余解析开销。

注意:如果业务场景中JSON存在多个CID同名字段,当前逻辑会返回最先遍历到的值,可根据业务需求调整匹配优先级规则。


内容的提问来源于stack exchange,提问作者Somnath Mukherjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:12:57