Android Kotlin解析JSON时null转JSONObject报错的解决方法
解决JSON解析null字段触发的转换异常问题
问题根源
使用getJSONObject("Geocode")和getJSONObject("Scores")时,若对应字段值为null,org.json库会直接抛出类型转换异常——因为getJSONObject要求目标值必须是有效的JSONObject,不接受null值。
修复方案
改用optJSONObject()方法替代getJSONObject(),该方法在字段为null或类型不匹配时会返回null,而非抛出异常。同时对null情况设置默认值,避免后续逻辑报错。
修改后的Kotlin代码
val outputJsonString = JSONObject(jsonData) val establishments = outputJsonString.getJSONObject("FHRSEstablishment") .getJSONArray("EstablishmentCollection") for(i in 0 until establishments.length()) { val currentEstablishment = establishments.getJSONObject(i) // 处理Geocode null情况 val geocode = currentEstablishment.optJSONObject("Geocode") val longitude = geocode?.optString("Longitude", "") ?: "" val latitude = geocode?.optString("Latitude", "") ?: "" // 处理Scores null情况 val scores = currentEstablishment.optJSONObject("Scores") val hygiene = scores?.optString("Hygiene", "") ?: "" val structural = scores?.optString("Structural", "") ?: "" val confidence = scores?.optString("ConfidenceInManagement", "") ?: "" list.add( Restaurant( currentEstablishment.getString("BusinessName"), currentEstablishment.getString("BusinessType"), currentEstablishment.getString("RatingValue"), currentEstablishment.getString("LocalAuthorityName"), arrayOf(hygiene, structural, confidence), currentEstablishment.getString("LocalAuthorityWebSite"), longitude, latitude ) ) }
关键修改点说明
- 替换
getJSONObject()为optJSONObject():安全获取可能为null的JSONObject字段,避免直接抛出异常 - 用
optString(key, defaultValue)替代getString():即使子字段为null,也能返回预设的默认空字符串,避免额外异常 - 提取
currentEstablishment变量:减少重复调用establishments.getJSONObject(i),提升代码可读性和执行效率
额外优化建议
如果需要频繁处理JSON解析,建议使用Gson、Moshi等序列化库,通过数据类+注解的方式自动处理null值,代码会更简洁易维护。比如用Gson时,只需定义对应数据类,就能直接将JSON解析为对象列表,无需手动处理每个字段的null情况。
内容的提问来源于stack exchange,提问作者Malhar
相关产品推荐
相关产品推荐

