JSON转Java POJO(Map场景)适配问题及OpenAPI.yml结构需求
动态键的JSON通用POJO转换方案
问题背景
我正在为以下JSON结构创建POJO,用于读取Excel中的JSON数据,但用已定义的DTO读取时抛出异常,推测是JSON与Java POJO结构不匹配。修复POJO后,我还计划在OpenAPI.yml中定义相同结构。由于acctKey、tranAmt、batchNum这类键会随UI选择动态变化,想找通用的POJO转换方案。
目标JSON结构
"filter": { "acctKey": { "filterType": "text", "operator": "OR", "condition1": { "filterType": "text", "type": "contains", "filter": "AC10" }, "condition2": { "filterType": "text", "type": "contains", "filter": "AC103750" } }, "tranAmt": { "filterType": "number", "type": "greaterThan", "filter": 2000 }, "batchNum": { "filterType": "number", "type": "equals", "filter": 1 } }
当前使用的Java代码片段
Map<String, Map<String, Map<String, String>>> filter
解决方案
1. 通用POJO设计
基础过滤条件类
定义一个能覆盖单条件、多条件场景的实体类,用Object兼容filter字段的字符串/数字类型,用Map接收动态的condition1/condition2键:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.Map; @Data @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class FilterCondition { private String filterType; private String type; private Object filter; private String operator; private Map<String, FilterCondition> conditions; }
顶层过滤容器类
用Map接收动态变化的acctKey、tranAmt这类键:
import lombok.Data; import java.util.Map; @Data public class FilterWrapper { private Map<String, FilterCondition> filter; }
2. 原方案问题分析
你之前使用的Map<String, Map<String, Map<String, String>>>存在两个核心问题:
- 无法兼容
filter字段的多类型(字符串/数字),反序列化时会触发类型转换异常 - 多条件嵌套结构(
operator+condition1/condition2)无法被多层Map正确解析,容易出现键名不匹配或类型错误
3. OpenAPI.yml对应结构定义
components: schemas: FilterCondition: type: object properties: filterType: type: string type: type: string filter: oneOf: - type: string - type: number operator: type: string conditions: type: object additionalProperties: $ref: '#/components/schemas/FilterCondition' FilterWrapper: type: object properties: filter: type: object additionalProperties: $ref: '#/components/schemas/FilterCondition'
4. 反序列化示例
使用Jackson进行JSON反序列化:
import com.fasterxml.jackson.databind.ObjectMapper; public class FilterParser { public static void main(String[] args) throws Exception { String jsonContent = "你的JSON字符串"; ObjectMapper mapper = new ObjectMapper(); FilterWrapper filterWrapper = mapper.readValue(jsonContent, FilterWrapper.class); // 后续业务处理 } }
内容的提问来源于stack exchange,提问作者tejas26389
相关产品推荐
相关产品推荐

