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
相关产品推荐
相关产品推荐

