Android应用解析JSON后无法在模拟器运行问题求助
Android应用安装后无法启动问题排查与修复
问题概述
编译、运行无报错,模拟器安装成功后无法启动,日志仅显示安装完成,推测是JSON文件访问或解析异常导致应用崩溃。
核心问题与修复方案
1. JSON文件语法错误
提供的JSON.json存在两处语法问题:
starred_url字段末尾多了一个逗号;- 整个JSON结构未闭合(
items数组、外层对象均缺少结束括号)。
修复后的JSON示例:
{ "total_count": 357602, "incomplete_results": false, "items": [ { "id": 23096959, "node_id": "...", "name": "...", "full_name": "...", "private": false, "owner": { "login": "...", "id": 4314092, "node_id": "...", "avatar_url": "https://...", "url": "https://api.github.com/users/golang", "followers_url": "https://api.github.com/users/golang/followers", "following_url": "https://api.github.com/users/golang/following{/other_user}", "starred_url": "https://api.github.com/users/golang/starred{/owner}{/repo}" } } ] }
2. JSON解析路径错误
MainActivity中尝试直接获取顶层owner数组,但实际JSON结构里,owner是items数组内每个对象的子对象,并非顶层数组。
修复后的MainActivity解析逻辑:
try { val jsonString = getJSONFromAssets() if (jsonString == null) { Log.e("MainActivity", "无法读取assets中的JSON文件") return } val obj = JSONObject(jsonString) val itemsArray = obj.getJSONArray("items") // 先获取items数组 for (i in 0 until itemsArray.length()) { val item = itemsArray.getJSONObject(i) val owner = item.getJSONObject("owner") // 从item中取出owner对象 val userId = owner.getInt("id") val nodeId = owner.getString("node_id") val avatarUrl = owner.getString("avatar_url") val followersUrl = owner.getString("followers_url") val starredUrl = owner.getString("starred_url") val userDetails = UserModelClass(userId, nodeId, avatarUrl, followersUrl, starredUrl) usersList.add(userDetails) } } catch (e: JSONException) { e.printStackTrace() Log.e("MainActivity", "JSON解析错误: ${e.message}") }
3. 字段映射不匹配
解析时使用的字段名与JSON实际字段、UserModelClass属性不对应:
- 原代码用
user.getString("name")赋值给node_id,但JSON中owner无name字段,应取node_id; - 原代码用
followers、stars字段,JSON中实际是followers_url、starred_url。
修复方案:
确保解析的字段名与JSON完全一致,且对应到UserModelClass的正确属性,参考上述修复后的解析逻辑。
4. 空值强制转换风险
原代码用getJSONFromAssets()!!强制转换,若JSON文件读取失败返回null,会直接抛出NullPointerException导致应用崩溃。
修复方案:
解析前先判断JSON字符串是否为null,避免强制转换,参考上述修复后的代码逻辑。
额外注意事项
- 确认
JSON.json文件放置在src/main/assets目录下,文件名大小写与代码中一致(Android系统区分大小写); - 检查
activity_main.xml中是否正确声明了rvUsersList,以及item_user.xml中各TextView的id是否与UserViewHolder中的findViewById调用对应。
内容的提问来源于stack exchange,提问作者Pop Raluca
相关产品推荐
相关产品推荐

