含特殊字符的JSON字符串转JSONObject解决方案咨询
修复过度转义的JSON字符串并转换为JSONObject
问题描述
你有一段被多次嵌套转义的JSON字符串,尝试用replace方法处理后仍残留异常,无法转换为合法的JSONObject。
原始异常字符串代码:
String text="\"\"\\\"{\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"createdAt\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"2023-10-31T11:43:29\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"updatedAt\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"2023-10-31T11:43:30\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"createdBy\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"updatedBy\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"isDeleted\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":false,\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"messageValue\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":{\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"name\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"hello world\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"status\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"CREATED\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"priority\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":1\\\\\\\\\\\\\\\\n}\\\\\\\\\\\\\\\n}\"\"";
你尝试过的无效代码:
text.replace("\\","").replace("\\n","UUU").replace("\\n","TTT").replace("\"\\"\\"\\"\\"{","\"{")
解决方案
这段字符串的核心问题是多层嵌套转义,加上首尾存在冗余的引号和转义字符。需要按以下步骤处理:
步骤1:提取核心转义内容
先去掉首尾的冗余字符:原始字符串开头是""\",结尾是\""",直接截取中间的有效部分:
String coreText = text.substring(3, text.length() - 3);
步骤2:还原转义字符
由于字符串被多次转义,比如\\\\对应实际的\\,\\\\n对应\n,需要把这些转义还原。推荐用成熟工具类避免手动出错:
- 用Apache Commons Lang的
StringEscapeUtils.unescapeJava()一键反转义:
import org.apache.commons.lang3.StringEscapeUtils; String unescapedText = StringEscapeUtils.unescapeJava(coreText);
- 如果不想引入第三方库,也可以手动分层替换:
String unescapedText = coreText.replace("\\\\", "\\") .replace("\\n", "\n");
步骤3:转换为JSONObject
用Jackson或Gson等JSON库将处理后的字符串转换为JSONObject:
import org.json.JSONObject; try { JSONObject jsonObject = new JSONObject(unescapedText); // 格式化输出验证结果 System.out.println("合法JSON:" + jsonObject.toString(2)); } catch (Exception e) { e.printStackTrace(); }
为什么之前的方法无效
你之前的replace("\\","")会直接删除所有转义符,导致原本用来转义引号的\"变成",破坏JSON的引号结构;同时替换顺序混乱,没有处理多层转义的逻辑,所以无法得到合法的JSON格式。
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

