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

Android应用JSON解析问题求助:特定格式JSON解析异常

嘿,我来帮你搞定这个Android JSON解析的问题!先瞅一眼你给的JSON结构,这是个嵌套层级挺多的对象,常见的坑无非是字段匹配错、嵌套对象解析乱或者数据类型不对这些情况。我给你分两种Android里常用的解析方式一步步说,你对着来就行:

方法一:用Android原生JSONObject解析

这种方式不需要额外依赖,适合简单或者临时的解析场景,完全用系统自带的API搞定:

try {
    // 假设你的原始JSON字符串存在jsonStr变量里
    JSONObject rootObj = new JSONObject(jsonStr);
    JSONObject ticker24hObj = rootObj.getJSONObject("ticker_24h");
    
    // 解析total模块的数据
    JSONObject totalObj = ticker24hObj.getJSONObject("total");
    double totalLast = totalObj.getDouble("last");
    double totalHigh = totalObj.getDouble("high");
    double totalLow = totalObj.getDouble("low");
    double totalVol = totalObj.getDouble("vol");
    int totalTrades = totalObj.getInt("trades");
    // 其他字段比如vwap、money同理,注意对应数据类型
    
    // 解析exchanges下的各个交易所数据
    JSONObject exchangesObj = ticker24hObj.getJSONObject("exchanges");
    
    // 解析NEG交易所
    JSONObject negObj = exchangesObj.getJSONObject("NEG");
    double negLast = negObj.getDouble("last");
    double negOpen = negObj.getDouble("open");
    // NEG的其他字段按同样逻辑解析
    
    // 解析MBT交易所(注意你给的JSON里MBT的内容没写完,解析时要确保字段完整)
    JSONObject mbtObj = exchangesObj.getJSONObject("MBT");
    double mbtLast = mbtObj.getDouble("last");
} catch (JSONException e) {
    e.printStackTrace();
    // 这里处理解析异常:比如字段不存在、数据类型不匹配时,给用户提示或者设置默认值
}

原生解析的避坑提示

  • 字段名必须和JSON里的完全一致,大小写、下划线都不能错,比如ticker_24h不能写成ticker24h
  • 数据类型要严格对应:浮点数字用getDouble,整数用getInt,如果不确定字段是否存在,用optDouble("last", 0.0)这种带默认值的方法,避免直接抛异常
方法二:用Gson库做序列化解析

如果JSON结构复杂或者后续要频繁解析,用Gson这类序列化库会更简洁,代码可读性也更高:

第一步:定义对应实体类

要和JSON的层级结构完全对应,字段名可以用@SerializedName和JSON字段映射:

// 最外层响应类
public class TickerResponse {
    @SerializedName("ticker_24h")
    private Ticker24h ticker24h;

    // getter和setter,或者用Lombok的@Data注解简化
    public Ticker24h getTicker24h() {
        return ticker24h;
    }

    public void setTicker24h(Ticker24h ticker24h) {
        this.ticker24h = ticker24h;
    }
}

// Ticker24h模块类
public class Ticker24h {
    private Total total;
    // exchanges的键是动态交易所名称(NEG、MBT),用Map接收更灵活
    private Map<String, Exchange> exchanges;

    // getter和setter
    public Total getTotal() { return total; }
    public void setTotal(Total total) { this.total = total; }
    public Map<String, Exchange> getExchanges() { return exchanges; }
    public void setExchanges(Map<String, Exchange> exchanges) { this.exchanges = exchanges; }
}

// Total数据类
public class Total {
    private double last;
    private double high;
    private double low;
    private double vol;
    private double vwap;
    private double money;
    private int trades;

    // 所有字段的getter和setter
}

// 交易所通用数据类(NEG、MBT结构一致,复用这个类)
public class Exchange {
    private double last;
    private double open;
    private double high;
    private double low;
    private double vol;
    private double vwap;
    private double money;
    private int trades;

    // 所有字段的getter和setter
}

第二步:用Gson解析JSON字符串

先在build.gradle里添加Gson依赖:

implementation 'com.google.code.gson:gson:2.10.1' // 可以用最新版本

然后编写解析代码:

Gson gson = new Gson();
TickerResponse response = gson.fromJson(jsonStr, TickerResponse.class);

// 获取total数据
Total totalData = response.getTicker24h().getTotal();
double totalLastPrice = totalData.getLast();

// 获取NEG交易所数据
Exchange negData = response.getTicker24h().getExchanges().get("NEG");
double negLastPrice = negData.getLast();

// 获取MBT交易所数据
Exchange mbtData = response.getTicker24h().getExchanges().get("MBT");
// ... 按需获取字段

Gson解析的避坑提示

  • 如果实体类字段名和JSON字段名不一致,一定要用@SerializedName注解映射
  • 对于动态键的对象(比如exchanges下的交易所),用Map<String, 实体类>接收,不用为每个交易所单独写字段
  • 如果JSON里有超大数字(比如money字段),可以把实体类里的double改成BigDecimal,避免精度丢失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:06:35