Android Studio中解析JSON字符串遇String无法转JSONObject异常如何解决
问题原因
你遇到的报错核心原因是你拿到的fullJson内容不符合JSON对象的格式要求,具体分两种常见情况:
- 你的接口返回的内容是被额外包裹了双引号的转义字符串,而非直接返回JSON结构:你校验时给出的格式是
"{\"data\":[{\"temperaturaussen\":12,\"feuchtaussen\":77.41}]}",可以看到整个JSON结构外层多了一对双引号,内部的双引号还被加了转义符\,此时你拿到的fullJson开头是双引号而非{,自然无法被识别为JSONObject。 - 另一种可能是接口返回的是带BOM头的UTF-8内容,开头多了不可见的
\uFEFF字符,也会导致解析失败。
解决步骤
- 首先打印
fullJson的完整内容和首尾字符,确认问题类型:
Log.d("DebugJson", "完整内容:$fullJson") Log.d("DebugJson", "首字符:${fullJson.first()},尾字符:${fullJson.last()}") Log.d("DebugJson", "首字符编码:${fullJson.first().code}")
- 根据问题类型处理:
- 如果是外层多了双引号、内部有转义符的情况,先处理字符串再解析:
// 先去掉首尾的双引号,再替换掉内部的转义斜杠 val processedJson = fullJson.trim('"').replace("\\\"", "\"") val dataJson = JSONObject(processedJson)
- 如果是BOM头导致的问题(首字符编码为65279),先移除BOM头:
val processedJson = fullJson.replace("\uFEFF", "") val dataJson = JSONObject(processedJson)
额外优化建议
你当前读取流的代码可以简化,Kotlin的use方法会自动关闭流,不需要手动关闭:
val fullJson = URL("你的接口地址").openConnection() .getInputStream() .bufferedReader(Charsets.UTF_8) .use { it.readText() }
内容的提问来源于stack exchange,提问作者user8110441
相关产品推荐
相关产品推荐

