如何移除JSON字符串中的无效转义反斜杠并保留有效转义字符
解决JSON中无效转义反斜杠的问题
首先,咱们得搞清楚你遇到的问题根源:你字符串里的\6在Java里属于八进制转义字符(对应ASCII码6的控制字符),但你实际想要的是把它当作普通的6来处理,同时保留\n、\t这类合法的转义字符。之前用StringEscapeUtils.escapeJava没效果,是因为这个工具的作用是给特殊字符添加转义,而不是清理无效的转义,反而会把原有的\6变成\\6,完全不符合你的需求。
解决方案:用正则精准替换无效转义
我们可以用正则表达式匹配那些不是有效转义的反斜杠,然后直接移除它们,同时保留合法的转义(比如\t、\n等)。
以下是具体的Java代码实现:
public class FixInvalidJsonEscapes { public static void main(String[] args) { // 注意:Java字符串里的反斜杠需要转义,所以原字符串里的\6要写成\\6 String testString = "{\"name\" : \"DROCK\", \"details\" : [{\"age\" : \"23\", \"degree\" : \"BE\", \"Experience\" : \"worked in a company\\6as an intern\"}]}"; // 正则规则:匹配反斜杠,但排除后面跟有效转义字符的情况 // 有效转义字符包括:\b, \t, \n, \f, \r, \", \', \\ String fixedString = testString.replaceAll("\\\\(?![btnfr\"'\\\\])", ""); System.out.println(fixedString); } }
正则表达式解释
\\\\:在Java字符串中,需要用四个反斜杠来表示一个实际的反斜杠(Java字符串转义一次,正则表达式再转义一次)。(?![btnfr\"'\\\\]):这是负向前瞻断言,意思是:只有当反斜杠后面不是b、t、n、f、r、"、'、\这些合法转义字符时,才匹配这个反斜杠。- 替换为空字符串,就相当于移除了这些无效的反斜杠。
测试效果
运行上面的代码,输出结果正好是你想要的:
{"name" : "DROCK", "details" : [{"age" : "23", "degree" : "BE", "Experience" : "worked in a company6as an intern"}]}
而且如果你的字符串里有\n、\t这类合法转义,比如"worked\nin a\tcompany",处理后会保留这些转义,不会被修改。
内容的提问来源于stack exchange,提问作者D_ROCKS




