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
相关产品推荐
相关产品推荐

