Kotlin中XML.toJSONObject方法无法正常执行的问题排查
Kotlin中XML.toJSONObject执行卡住无输出无异常的排查方案
1. 确认依赖的正确性与版本
你当前使用的org.json库可能存在问题:
- Android系统自带的
org.json包没有XML工具类,必须手动引入第三方的org.json库; - 旧版本的
org.json可能存在XML解析的兼容性bug。
如果用Gradle构建,确保依赖是最新的官方版本:
implementation 'org.json:json:20240303'
2. 排查线程阻塞问题(Android场景)
如果这段代码在Android主线程执行,XML.toJSONObject的解析操作可能因耗时触发ANR(应用无响应),导致后续代码无法执行,且不会抛出常规异常(ANR属于主线程超时,不属于代码异常范畴)。
解决方式是将解析逻辑放到子线程执行,比如用协程:
import kotlinx.coroutines.* import org.json.JSONException import org.json.XML import android.util.Log fun xml_to_json() { val xml = """ <Author> <address> <street>Internet Broadline</street> <postcode>123456</postcode> </address> <name>bezkoder</name> <age>26</age> </Author> """ CoroutineScope(Dispatchers.IO).launch { try { Log.d("OK", "OK") val obj = XML.toJSONObject(xml) withContext(Dispatchers.Main) { Log.d("OK2", "OK2") Log.d("JSON", obj.toString(4)) } } catch (e: Exception) { Log.d("ERROR", "解析失败", e) } } }
3. 扩大异常捕获范围
你的代码仅捕获JSONException,但解析过程中可能抛出其他RuntimeException(如空指针、非法参数异常),导致线程直接终止且无日志输出。修改捕获范围为Exception,并打印完整异常栈:
try { Log.d("OK", "OK") val obj = XML.toJSONObject(xml) Log.d("OK2", "OK2") Log.d("JSON", obj.toString(4)) } catch (e: Exception) { Log.d("NOT_OK", "解析出错", e) }
4. 检查XML格式的隐性问题
看似正常的XML可能包含隐藏不可见字符或编码问题,尝试压缩XML为一行后再测试:
val xml = "<Author><address><street>Internet Broadline</street><postcode>123456</postcode></address><name>bezkoder</name><age>26</age></Author>"
内容的提问来源于stack exchange,提问作者Maarten Schaeffers
相关产品推荐
相关产品推荐

