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

Android中解析复杂JSON文件出错及打印异常问题咨询

Android解析JSON打印出错?先从修正JSON格式开始!

兄弟,你遇到的打印错误十有八九是因为JSON格式不标准!你贴的这段JSON里,所有的键名(比如conferences、id、name)都没加双引号,这可是JSON的语法硬规则——标准JSON要求所有键必须用双引号包裹,不然解析库根本认不出,直接就会抛出语法错误。

先给你修正后的标准JSON片段:

{
  "conferences": [
    {
      "id": "7ab1c9c0-4ffa-4f27-bcb6-be54d6ca6127",
      "name": "EASTERN CONFERENCE",
      "alias": "EASTERN",
      "divisions": [
        {
          "id": "1fad71d8-5b9e-4159-921b-9b98d0573f51",
          "name": "Atlantic",
          "alias": "ATLANTIC",
          "teams": [
            {
              "id": "4417d3cb-0f24-11e2-8525-18a905767e44",
              "name": "Lightning",
              "market": "Tampa Bay",
              "reference": "14",
              "rank": {
                "division": 1,
                "conference": 1,
                "clinched": "c..."
              }
            }
          ]
        }
      ]
    }
  ]
}

接下来给你两种Android里常用的解析+打印方法:

方法一:用原生JSONObject解析(无需第三方库)

如果你的JSON结构不算特别复杂,用Android自带的JSONObject和JSONArray就能搞定,代码示例如下:

try {
    // 假设你已经把JSON文件内容读取到了字符串jsonStr里
    JSONObject rootObj = new JSONObject(jsonStr);
    JSONArray conferencesArray = rootObj.getJSONArray("conferences");
    
    // 遍历会议数组
    for (int i = 0; i < conferencesArray.length(); i++) {
        JSONObject conferenceObj = conferencesArray.getJSONObject(i);
        String confId = conferenceObj.getString("id");
        String confName = conferenceObj.getString("name");
        Log.d("JSON解析", "会议ID:" + confId + ",会议名称:" + confName);
        
        // 遍历分区数组
        JSONArray divisionsArray = conferenceObj.getJSONArray("divisions");
        for (int j = 0; j < divisionsArray.length(); j++) {
            JSONObject divisionObj = divisionsArray.getJSONObject(j);
            String divName = divisionObj.getString("name");
            Log.d("JSON解析", "分区名称:" + divName);
            
            // 遍历球队数组
            JSONArray teamsArray = divisionObj.getJSONArray("teams");
            for (int k = 0; k < teamsArray.length(); k++) {
                JSONObject teamObj = teamsArray.getJSONObject(k);
                String teamName = teamObj.getString("name");
                String market = teamObj.getString("market");
                JSONObject rankObj = teamObj.getJSONObject("rank");
                int divRank = rankObj.getInt("division");
                
                Log.d("JSON解析", "球队:" + market + " " + teamName + ",分区排名:" + divRank);
            }
        }
    }
} catch (JSONException e) {
    e.printStackTrace();
    Log.e("JSON错误", "解析失败:" + e.getMessage());
}

方法二:用Gson库解析(更简洁,适合复杂结构)

如果JSON层级多、结构复杂,用Gson会省心很多,先在build.gradle(Module级别)里添加依赖:

dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

然后先创建对应的数据类(POJO):

// 球队排名类
class Rank {
    int division;
    int conference;
    String clinched;
}

// 球队类
class Team {
    String id;
    String name;
    String market;
    String reference;
    Rank rank;
}

// 分区类
class Division {
    String id;
    String name;
    String alias;
    List<Team> teams;
}

// 会议类
class Conference {
    String id;
    String name;
    String alias;
    List<Division> divisions;
}

// 根类
class Root {
    List<Conference> conferences;
}

然后解析并打印:

Gson gson = new Gson();
Root root = gson.fromJson(jsonStr, Root.class);

// 遍历打印
for (Conference conf : root.conferences) {
    Log.d("Gson解析", "会议:" + conf.name);
    for (Division div : conf.divisions) {
        Log.d("Gson解析", "分区:" + div.name);
        for (Team team : div.teams) {
            Log.d("Gson解析", "球队:" + team.market + " " + team.name + ",分区排名:" + team.rank.division);
        }
    }
}

最后提醒几个注意点:

  • 确保JSON文件读取正确:如果是assets里的文件,要注意读取时的编码;如果是本地存储的文件,要确保文件路径正确、权限足够。
  • 打印时别直接打印JSONObject/JSONArray对象:直接打印会输出内存地址,要调用toString()方法或者像上面那样提取字段打印。
  • 处理空值:如果JSON里可能有null字段,解析时可以用optString()代替getString(),避免抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:35:32