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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:01:02