Android Studio发送JSONObject报StackOverflowError异常如何解决?
报错含义
Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate org.json.JSONObject.toString()
该报错表示安卓自带的org.json.JSONObject执行toString()序列化操作时,递归调用深度超出了ART虚拟机的栈深度限制,触发栈溢出。你提到缩小JSON体积就可以正常发送,恰好对应递归深度下降、栈占用回到合法阈值的情况。
问题根因
- 你的POST参数拼接逻辑存在缺陷:直接将
JSONObject实例和其他字符串拼接,隐式调用toString(),且没有对参数值做URL编码。如果用户从网页复制的内容中包含&、%、+等表单特殊字符,不仅会破坏POST请求的参数结构,还可能导致JSONObject序列化逻辑出现异常递归。 - 现有文本清理规则覆盖不全:从网页复制的内容通常会携带零宽字符、不间断空格、HTML转义实体等不可见特殊字符,你当前的正则规则没有覆盖这类字符,会干扰JSONObject的正常序列化。
解决步骤
- 修正POST参数提交逻辑
不要手动拼接表单字符串,对每个参数值单独做URL编码后再拼接,同时移除多余的connection.connect()调用(HttpURLConnection在获取输出流时会自动完成连接,后置调用会引发额外异常):// 先单独序列化JSON,方便单独定位序列化问题 String jsonContent = finalobjectCopy.toString(); // 逐个编码参数值,避免特殊字符破坏参数结构 String postBody = "idUser=" + URLEncoder.encode(idUser, StandardCharsets.UTF_8.name()) + "&myJsonArray=" + URLEncoder.encode(jsonContent, StandardCharsets.UTF_8.name()) + "&act=backupDados_V2" + "&data=" + URLEncoder.encode(currentDateandTime, StandardCharsets.UTF_8.name()); bufferedWriter.write(postBody); - 完善文本清理规则
补充清理网页内容常见的特殊字符:// 移除零宽字符 myString = myString.replaceAll("[\u200B-\u200D\uFEFF]", ""); // 替换不间断空格为普通空格 myString = myString.replaceAll("\u00A0", " "); // 移除HTML转义实体,不需要保留HTML格式可开启 myString = myString.replaceAll("&[a-zA-Z0-9]+;", ""); // 原有清理规则保留 myString = myString.replaceAll("[^\\x00-\\x7F]", ""); myString = myString.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", ""); - 替换JSON序列化库(可选)
安卓原生org.json库的容错性和性能表现较差,对于复杂文本场景容易出现异常,可以替换为Gson、FastJSON等第三方JSON序列化库,规避原生库的栈溢出问题。
内容的提问来源于stack exchange,提问作者Manuel Rodrigues
相关产品推荐
相关产品推荐

