Java使用Gson将嵌套JSON内Buy/Sell模式数组解析为独立ArrayList的方法
Gson反序列化JSON时的类型转换异常修正
异常根因拆解
原代码触发ClassCastException的核心原因有三个:
- 类型匹配错误:JSON结构中
Patterns.Buy、Patterns.Sell字段为字符串数组,Gson解析后对应Java类型是ArrayList,并非键值对结构的Map。原代码强行将数组实例强转为Map类型,直接触发类型转换异常。 - 赋值逻辑错乱:原代码两次对
buyPatternsUsed字段赋值,第一次错误塞入Sell数组的值,第二次被Buy数组的值覆盖,全程未给sellPatternsUsed字段赋值,字段映射关系完全错误。 - 无效变量引用:原代码中直接调用的
map对象未做初始化和赋值,属于逻辑缺失的无效引用。
可落地的正确实现
方案1:Gson自动映射(推荐)
不需要手动遍历JSON节点,通过补全类的嵌套结构、配合自动映射能力完成反序列化,从根源减少强转出错概率:
- 在
AgentStrategy类中新增对应Patterns节点的内部结构:
public class AgentStrategy { // 原有字段保持不变 private String Market; private String Coin; private double EmergencyPerc; private double TakeProfitPerc; private String ProtectiveOrdersEnabled; public double EMACrossMarginPerc; public String EMABuySellPeriod; public String EMABuySellNameLow; public String EMABuySellNameHigh; public String EMAUnfreezePeriod; public String EMAUnfreezeNameLow; public String EMAUnfreezeNameHigh; private String SimTemplate; private ArrayList<PriceDropSell> PriceDropSells; private ArrayList<String> buyPatternsUsed = new ArrayList<>(); private ArrayList<String> sellPatternsUsed = new ArrayList<>(); // 新增内部类匹配Patterns节点结构 private static class PatternsNode { ArrayList<String> Buy; ArrayList<String> Sell; } // 新增Patterns节点的对应字段 private PatternsNode Patterns; }
- 修改反序列化方法,在Gson自动解析完成后完成字段同步:
public AgentStrategy parseJsonToObject(String jsonString) { Gson gson = new Gson(); AgentStrategy agent = gson.fromJson(jsonString, AgentStrategy.class); // 自动映射完成后,将嵌套节点的数组值同步到目标字段 if (agent.Patterns != null) { agent.buyPatternsUsed = agent.Patterns.Buy; agent.sellPatternsUsed = agent.Patterns.Sell; } return agent; }
方案2:手动节点解析
如果不想修改原有类的结构,可通过JsonObject逐层取值,避免无意义的强转:
public AgentStrategy parseJsonToObject(String jsonString) { Gson gson = new Gson(); // 先将字符串解析为JsonObject,方便逐层获取节点值 JsonObject rootObj = JsonParser.parseString(jsonString).getAsJsonObject(); AgentStrategy agent = gson.fromJson(rootObj, AgentStrategy.class); // 直接获取Patterns节点下的Buy、Sell数组,通过类型转换为目标List结构 JsonObject patternsObj = rootObj.getAsJsonObject("Patterns"); ArrayList<String> buyList = gson.fromJson( patternsObj.getAsJsonArray("Buy"), new TypeToken<ArrayList<String>>(){}.getType() ); ArrayList<String> sellList = gson.fromJson( patternsObj.getAsJsonArray("Sell"), new TypeToken<ArrayList<String>>(){}.getType() ); // 分别为两个目标字段赋值 agent.buyPatternsUsed = buyList; agent.sellPatternsUsed = sellList; return agent; }
注:原代码中对Sell、Buy数组的强转是异常触发的直接原因——数组结构和Map结构不存在继承关系,强制转换必然失败。
内容的提问来源于stack exchange,提问作者A. Vreeswijk
相关产品推荐
相关产品推荐

