You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:36:09