如何修复包含未转义特殊字符的无效 JSON

雨晨吖_2476

雨晨吖_2476

2026-09-10

646人浏览

原创

如何修复包含未转义特殊字符的无效 JSON

本文介绍在 Java 中修复因反斜杠 或双引号 " 未正确转义而导致的无效 JSON 字符串的方法,涵盖行级解析、智能字符串清洗、安全转义策略及注意事项,适用于无法控制数据源时的接收端容错处理。

本文介绍在 java 中修复因反斜杠 `` 或双引号 `"` 未正确转义而导致的无效 json 字符串的方法,涵盖行级解析、智能字符串清洗、安全转义策略及注意事项,适用于无法控制数据源时的接收端容错处理。

JSON 规范严格要求字符串中的特殊字符(如 "、、控制字符等)必须被正确转义。当数据库 CLOB 字段返回类似 {"appName": "Sample "App " Name"} 这类非法 JSON(含裸露的未转义双引号或孤立反斜杠)时,标准解析器(Gson、Jackson)会直接抛出 MalformedJsonException —— 因为语法已破坏,任何“简单 replace”都无法普适修复:盲目全局替换 " 为 " 可能误伤键名、嵌套结构或已合法转义的部分;而 StringEscapeUtils.escapeJson() 等工具面向「合法字符串内容」而非「非法 JSON 文本」,故不适用。

✅ 推荐方案:结构感知的逐行清洗(PoC 实现)

核心思路是避免正则硬匹配复杂嵌套结构,转而利用 JSON 的基础语法规则(如 : 分隔键值、{ } [ ] 定义容器)进行轻量级格式化与上下文感知清洗:

  1. 预格式化:插入换行分隔结构符号,使每行聚焦单一逻辑单元(键值对或容器边界);
  2. 行级处理:仅对形如 key: value 的行提取 value 部分,剥离首尾引号后,安全移除非法 并转义所有 ";
  3. 重建 JSON:拼接清洗后的键值对,再交由标准解析器验证/美化。

以下是可直接运行的 Java 示例(基于 Gson):

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载
import com.google.gson.*;
import java.util.Scanner;
import java.util.regex.Pattern;

public class JsonRepair {
    public static String repairCorruptJson(String corruptJson) {
        // Step 1: 标准化空白与结构分隔(增强可读性,便于行处理)
        String normalized = corruptJson
                .replaceAll("\s*:\s*", ":")           // 压缩键值分隔符周围的空格
                .replaceAll("([\{\},\[\]])", "
$1
"); // 用换行包裹结构符号

        StringBuilder cleaned = new StringBuilder();
        try (Scanner scanner = new Scanner(normalized)) {
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine().trim();
                if (line.isEmpty() || line.matches("[\{\},\[\]]")) {
                    cleaned.append(line).append("
");
                    continue;
                }

                // 匹配 key: "value" 或 key: value 形式(支持无引号 value,但本场景主要处理字符串)
                int colonIdx = line.indexOf(':');
                if (colonIdx > 0 && line.length() > colonIdx + 1) {
                    String key = line.substring(0, colonIdx).trim();
                    String value = line.substring(colonIdx + 1).trim();

                    // 仅对字符串值做清洗:移除首尾引号 → 清理非法  → 转义所有 "
                    if (value.startsWith(""") && value.endsWith(""")) {
                        String unquoted = value.substring(1, value.length() - 1);
                        String safeValue = unquoted
                                .replace("\", "")     // 移除所有裸露反斜杠(假设无真实转义需求)
                                .replace(""", "\""); // 转义所有双引号
                        cleaned.append(key).append(":"").append(safeValue).append(""
");
                    } else {
                        cleaned.append(line).append("
"); // 非字符串值保持原样
                    }
                } else {
                    cleaned.append(line).append("
");
                }
            }
        }

        // Step 2: 使用 Gson 解析清洗后文本(验证合法性并输出规范 JSON)
        try {
            JsonElement parsed = JsonParser.parseString(cleaned.toString());
            return new GsonBuilder().setPrettyPrinting().create()
                    .toJson(parsed);
        } catch (JsonParseException e) {
            throw new IllegalArgumentException("Failed to repair JSON: " + e.getMessage(), e);
        }
    }

    // 使用示例
    public static void main(String[] args) {
        String corrupt = "{"appName": "Sample \ "App "  Name", "foo": "Bar App \ "Name",
" +
                         "  "test":[{"a": "b"}]}";
        System.out.println(repairCorruptJson(corrupt));
    }
}

⚠️ 关键注意事项

  • 这不是通用 JSON 修复器:该方案假设错误集中于字符串值内的 " 和 ,且 JSON 整体结构(括号匹配、键值对分布)基本完好。若存在严重语法断裂(如缺失 }、乱序 ]),需引入更重的解析器(如 ANTLR)或人工规则兜底。
  • 反斜杠处理需谨慎:示例中直接 replace("\", "") 是因业务场景确认 无真实转义意图(如路径、正则)。若需保留有效转义(如 ),应改用状态机识别 \"、\uXXXX 等合法序列,仅修复非法单 。
  • 其他需关注字符:除 " 和 外,JSON 字符串中还禁止未转义的控制字符(U+0000–U+001F),如 、 、 。若数据源可能含此类字符,应在清洗阶段统一替换为 \t、\r、\n。
  • 根本解法仍是源头治理:务必推动 DB 层使用 JSON.stringify() 或 PreparedStatement 参数化写入,杜绝字符串拼接生成 JSON。

通过结构化清洗而非暴力正则,该方法在可控复杂度下显著提升接收端鲁棒性,让系统在数据质量波动时仍能维持基本可用性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4296

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1335

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1718

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

9863

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

960

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2664

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1549

5

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

2023.09.21

4549

3

js生成随机数方法
js生成随机数方法

JavaScript生成随机数的方法,包括使用Math.random()方法生成指定范围内的随机整数、生成随机字符串和生成随机颜色。根据具体需求,可以选择适合的方法来生成随机数,以实现各种功能 。

2023.09.25

2615

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习