You need to enable JavaScript to run this app. Java使用Gson将嵌套JSON内Buy/Sell模式数组解析为独立ArrayList的方法
优惠活动
大模型
产品
解决方案
定价
更多

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节点,通过补全类的嵌套结构、配合自动映射能力完成反序列化,从根源减少强转出错概率:

  1. 在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;
}
  1. 修改反序列化方法,在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 19:54:03