如何在无JsonArray场景下使用Volley解析JsonObject数据
解决思路
针对你拿到的非数组结构的data节点,下面给出两种可直接落地的实现方案:
方案1:原生JSONObject迭代遍历(无需引入第三方依赖)
Android 自带的org.json.JSONObject已经提供了key迭代能力,直接遍历data节点下所有的数字key即可拿到对应的数据对象:
// 假设你已经通过Volley请求拿到根JSONObject对象 rootJson JSONObject dataObj = rootJson.getJSONObject("data"); // 获取data下所有key的迭代器 Iterator<String> keyIterator = dataObj.keys(); while (keyIterator.hasNext()) { String itemKey = keyIterator.next(); // 获取单场比赛的JSON对象 JSONObject matchObj = dataObj.getJSONObject(itemKey); // 按需提取对应字段即可 String id = matchObj.getString("id"); String leagueName = matchObj.getString("leagueName"); String teamOne = matchObj.getString("teamOne"); String ratio = matchObj.getString("ratio"); // 其余字段按同样逻辑提取 }
方案2:Gson转Map使用(代码更简洁,适合字段多的场景)
如果你的项目已经引入Gson,直接将data节点转换为Map结构使用,后续调用更方便:
- 先定义比赛信息实体类
public class MatchInfo { private String id; private String price; private String userBought; private String leagueName; private String teamOne; private String teamTwo; private String date; private String result; private String teamOneScore; private String teamTwoScore; private String info; private String ratio; // 按需添加getter、setter方法即可 }
- 转换解析
String dataStr = rootJson.getJSONObject("data").toString(); Gson gson = new Gson(); // 指定Map的泛型类型 Type mapType = new TypeToken<Map<Integer, MatchInfo>>(){}.getType(); Map<Integer, MatchInfo> matchMap = gson.fromJson(dataStr, mapType); // 直接遍历Map即可拿到所有比赛数据 for (MatchInfo match : matchMap.values()) { // 直接调用实体类的get方法取字段即可 Log.d("比赛信息", match.getTeamOne() + " vs " + match.getTeamTwo()); }
两种方案都不需要强行把data节点转成JSONArray,是适配当前JSON结构的最优实现。
内容的提问来源于stack exchange,提问作者Nina Gos
相关产品推荐
相关产品推荐

