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

如何在无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结构使用,后续调用更方便:

  1. 先定义比赛信息实体类
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方法即可
}
  1. 转换解析
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:39:00