Kotlin遍历JsonArray报UnsupportedOperationException:JsonNull异常排查
报错原因
你遇到的Fatal Exception: java.lang.UnsupportedOperationException: JsonNull是Gson解析时的典型异常,触发原因是代码中对Json元素做类型强转、取值时,没有做JsonNull类型校验,具体问题点如下:
- 遍历数组时直接调用
jsonArray.get(i).getAsJsonObject(),如果数组第i位的元素是JsonNull类型,强转JsonObject会直接抛出异常 - 代码中多处使用
!!非空断言强转对象,一旦前置取值结果为null,会直接触发空指针 - 从JsonObject中取三个业务字段时,直接调用
getAsString(),只要任意一个字段不存在、或字段值为JsonNull,就会触发你遇到的这个UnsupportedOperationException
修复方案
替换为以下带空安全、类型校验的解析逻辑即可:
for (i in 0 until (jsonArray?.size() ?: 0)) { // 校验当前数组元素为合法JsonObject,不合法则跳过当前项 val stringCode = jsonArray?.get(i)?.takeIf { it.isJsonObject }?.asJsonObject ?: continue // 逐字段取值,遇到JsonNull、类型不匹配时赋值默认空串,避免异常 val airwayBillNo = stringCode.get(TagName.AIRWAYBILLNO)?.takeIf { it.isJsonPrimitive }?.asString ?: "" val status = stringCode.get(NotificationCompat.CATEGORY_STATUS)?.takeIf { it.isJsonPrimitive }?.asString ?: "" val syncValue = stringCode.get(DatabaseHandler.Companion.KEY_SYNC)?.takeIf { it.isJsonPrimitive }?.asString ?: "" singleUpdateArrayList?.add( SingleUpdateResp(airwayBillNo, status, syncValue) ) }
修复逻辑说明:
- 移除所有不安全的
!!非空断言,改用Kotlin安全调用?.配合空值默认值,从根源避免空指针 - 数组长度取值加空安全,如果jsonArray本身为null,直接不进入循环,不会触发崩溃
- 数组元素先做类型校验,非JsonObject类型的元素直接跳过,不中断整个遍历流程
- 每个字段取值前先校验是否为字符串基本类型,排除JsonNull、嵌套对象、数组等非法类型,取不到值时用空字符串作为默认值,彻底解决JsonNull导致的异常
内容的提问来源于stack exchange,提问作者Raj Kumar Barayee
相关产品推荐
相关产品推荐

