Kotlin中如何对API返回的动态JSON类型(String/JsonArray)进行类型检查(避免try/catch)
如何在Kotlin中安全检查动态JSON字段的类型(String/JsonArray)
你遇到的问题很典型:API返回的字段类型不确定,要么是单个字符串(对应JsonPrimitive),要么是字符串数组(JsonArray),但你之前的代码错误地判断了JsonObject而非JsonPrimitive,导致单个字符串的情况完全没被处理。而且用try/catch确实不是优雅的做法,咱们用Kotlin的类型判断就能完美解决。
先看你之前的代码问题:单个字符串类型的JSON值会被解析为JsonPrimitive,而不是JsonObject,所以你的第一个分支永远不会命中这种情况。
修正后的实现代码
val myData = optional.get("keyOfData") when(myData) { is JsonPrimitive -> { // 处理单个字符串的场景 val singleString = myData.asString when (singleString) { // 这里写你针对单个字符串的操作逻辑 } } is JsonArray -> { // 处理字符串数组的场景 myData.forEach { element -> // 额外做一层安全检查,确保数组元素是字符串类型的JsonPrimitive if (element is JsonPrimitive && element.isString) { val itemString = element.asString when (itemString) { // 这里写针对数组中每个字符串的操作逻辑 } } } } // 可选:处理其他意外类型(比如JsonObject或者null) else -> { // 可以加日志提示,或者默认处理逻辑 } }
几个关键点:
- 优先判断
JsonPrimitive:这是单个字符串对应的类型,必须把这个分支加上,才能覆盖API返回单个值的情况。 - 数组元素的安全校验:遍历
JsonArray时,最好检查每个元素是不是字符串类型的JsonPrimitive——避免API返回的数组里混有其他类型(比如数字、对象)导致调用asString时出错。 - 完全避免try/catch:用Kotlin的
is类型判断,既清晰又高效,比依赖异常捕获处理类型分支靠谱多了。
内容的提问来源于stack exchange,提问作者Dim
相关产品推荐
相关产品推荐

