如何正确反转义含内部转义字符的JSON字符串?
如何保留JSON字符串内部的转义字符?
现有一段带转义的JSON字符串:
{"id":"1","name":"cat with \"Bob\" name"}
需求是正确处理后保留文本内部的转义,最终得到的有效JSON需和原字符串格式一致:
{"id":"1","name":"cat with \"Bob\" name"}
试过的无效方法
我用了两种Java方式处理,但都会把所有转义全部移除,生成无效JSON:
// 方法1:用JSONObject解析 JSONObject jsonObject = new JSONObject(jsonStringEscaped); // 方法2:用StringEscapeUtils反转义 StringEscapeUtils.unescapeJava(jsonStringEscaped)
处理后得到的无效JSON:
{"id":"1","name":"cat with "Bob" name"}
解决办法
方法1:基于JSON解析+字段重转义
先解析JSON结构拿到字段值,再对字段值单独转义后重新构造JSON:
// 1. 解析原始JSON,拿到未转义的字段值 JSONObject jsonObject = new JSONObject(jsonStringEscaped); String nameValue = jsonObject.getString("name"); // 此时值为 "cat with "Bob" name" // 2. 对字段值里的双引号重新转义 String escapedName = nameValue.replace("\"", "\\\""); jsonObject.put("name", escapedName); // 3. 输出符合要求的JSON字符串 String validJson = jsonObject.toString();
方法2:用Jackson等专业JSON库处理
专业JSON库会自动区分JSON结构转义和内容转义,默认就能正确输出:
ObjectMapper mapper = new ObjectMapper(); // 解析原始JSON JsonNode node = mapper.readTree(jsonStringEscaped); // 序列化输出,自动保留正确的转义格式 String validJson = mapper.writeValueAsString(node);
原理说明
问题出在混淆了Java字符串转义和JSON格式转义:你拿到的原始字符串是Java层面的表示,其中的\"是Java用来指代JSON里的";直接全局反转义会把Java转义去掉,导致JSON结构里的双引号失去转义,破坏格式。正确的做法是让JSON库处理结构解析,再按需对内容做转义后重新序列化。
内容的提问来源于stack exchange,提问作者Volodymyr Patriiuk
相关产品推荐
相关产品推荐

