如何反序列化含动态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:手动修改已生成的类
如果已经生成了带固定属性的类,也可以手动改造:
- 删除所有
private Exchange1 exchange1;这类硬编码的字段 - 添加
private Map<String, Map<String, List<String>>> exchanges; - 补充对应的getter/setter方法
这样改造后,就能直接用Map的遍历能力处理所有动态内容了。
内容的提问来源于stack exchange,提问作者c0dehunter
相关产品推荐
相关产品推荐

