解析TSV文件内嵌JSON文档时Gson转义异常如何解决
解决方案
问题根因
你遇到的解析异常核心是TSV读取逻辑导致的JSON转义层级破坏:
TSV格式默认将反斜杠作为转义字符,你读取TSV第四列时,TSV解析器已经对原始JSON的转义字符做了一层转义处理,拿到的字符串已经丢失了JSON原本的转义规则。你后续全局替换反斜杠的操作会进一步破坏残留的合法转义,比如原本合法的\"会被转成\\",导致引号提前闭合,触发JSON格式异常。
最优方案:修正TSV读取逻辑(一劳永逸)
直接从数据源端解决问题,读取TSV时关闭转义规则,拿到原始未被转义的JSON字符串,不需要任何额外处理即可正常解析。
以OpenCSV的TSV解析为例,配置示例:
// 构造TSV解析器时关闭转义字符 CSVParser tsvParser = new CSVParserBuilder() .withSeparator('\t') .withEscapeChar(CSVWriter.NO_ESCAPE_CHARACTER) // 核心配置:不处理转义 .build(); CSVReader reader = new CSVReaderBuilder(new FileReader("your-file.tsv")) .withCSVParser(tsvParser) .build();
备选方案:容错解析(无法修改TSV读取逻辑时使用)
不要自己写全局转义逻辑,极易破坏JSON结构,直接使用容错性更高的JSON解析器先做格式归一,再用Gson解析。推荐用org.json的宽松解析器处理:
- 引入org.json依赖
- 解析逻辑修改为:
try { // 优先直接解析合法JSON json.setInputReference(gson.fromJson(rowJsonMappingJson, Structured.class)); } catch (JsonParseException exception) { // 用org.json做容错归一化 org.json.JSONObject rawJson = new org.json.JSONObject(rowJsonMappingJson); String normalizedJson = rawJson.toString(); // 归一化后的JSON可直接用Gson解析 json.setInputReference(gson.fromJson(normalizedJson, Structured.class)); }
避坑提醒
- 不要对整个JSON字符串做全局的反斜杠、引号替换,会把JSON结构本身的符号转义破坏。
- 不要用你自定义的escapeJson方法,该方法会把JSON结构的双引号也转义,直接导致整个JSON结构失效。
内容的提问来源于stack exchange,提问作者Shankar Guru
相关产品推荐
相关产品推荐

