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

