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

如何反序列化含动态Exchange键的JSON数据?

解决动态键JSON的Java反序列化问题

这个场景我太熟悉了!你的JSON里全是动态命名的键(比如Exchange1、Exchange2,还有内部的EUR、INR这类货币代码),jsonschema2pojo默认会把这些固定字符串生成类的硬编码属性,自然没法遍历所有动态内容。下面给你几个实用的解决方案:

方案1:直接用嵌套Map接收

这是最直接的方式,你的JSON结构本质上是**“交易所名称 -> 基础货币 -> 目标货币列表”**的三层映射,完全可以用Map<String, Map<String, List<String>>>来表示。

如果用jsonschema2pojo生成代码,记得在工具的配置里勾选**"Use Maps for dynamic typing"**选项,它就会自动把所有动态键转换成Map结构,而不是生成Exchange1、Exchange2这类固定属性。

生成后的类大概长这样:

public class ExchangeRates {
    private Map<String, Map<String, List<String>>> exchanges;

    // getter和setter
    public Map<String, Map<String, List<String>>> getExchanges() {
        return exchanges;
    }

    public void setExchanges(Map<String, Map<String, List<String>>> exchanges) {
        this.exchanges = exchanges;
    }
}

之后遍历就非常灵活了:

// 假设已经反序列化得到exchangeRates对象
for (Map.Entry<String, Map<String, List<String>>> exchangeEntry : exchangeRates.getExchanges().entrySet()) {
    String exchangeName = exchangeEntry.getKey(); // 比如"Exchange1"
    Map<String, List<String>> currencyMap = exchangeEntry.getValue();
    
    // 遍历该交易所下的所有货币对
    for (Map.Entry<String, List<String>> currencyEntry : currencyMap.entrySet()) {
        String baseCurrency = currencyEntry.getKey(); // 比如"EUR"
        List<String> targetCurrencies = currencyEntry.getValue(); // 比如["CNY", "USD"]
        
        // 这里写你的业务逻辑
        System.out.printf("交易所%s:%s可兑换%s%n", exchangeName, baseCurrency, String.join(", ", targetCurrencies));
    }
}

方案2:自定义JSON Schema来约束生成

如果你想通过Schema来精准控制代码生成,可以手动写一个Schema,明确告诉工具哪些部分是动态的:

{
  "type": "object",
  "additionalProperties": {
    "type": "object",
    "additionalProperties": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}

把这个Schema输入到jsonschema2pojo里,它就会直接生成基于Map的类,不需要额外配置。

方案3:手动修改已生成的类

如果已经生成了带固定属性的类,也可以手动改造:

  1. 删除所有private Exchange1 exchange1;这类硬编码的字段
  2. 添加private Map<String, Map<String, List<String>>> exchanges;
  3. 补充对应的getter/setter方法

这样改造后,就能直接用Map的遍历能力处理所有动态内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:10:26