如何处理JSON文件字符串内未转义双引号避免解析报错且不破坏边界引号
问题原因
你遇到的错误根源是JSON文件不符合语法规范:字符串值内部的双引号没有做转义处理(正确写法应该是\"),导致JSON解析器把内部的双引号识别成了字符串边界,抛出解析错误。
解决方案
方案1:使用容错JSON解析库(操作最简单,推荐)
可以使用第三方库demjson3,它支持非严格模式的JSON解析,会自动识别并修复字符串内部未转义的双引号问题,无需手动处理文本。
操作步骤:
- 安装依赖:
pip install demjson3 - 修改代码如下:
import demjson3 import json # 读取文件并容错解析 with open('file.json', 'r', encoding='utf-8') as fh: # strict=False开启非严格解析,自动修复未转义引号问题 data = demjson3.decode(fh.read(), strict=False) result = [] # 以下是原有结构转换逻辑,无需修改 for article in data["data"]: for paragraph in article["paragraphs"]: for qa in paragraph["qas"]: answers = {"text": [answer["text"] for answer in qa["answers"]]} result.append({ "id": qa["id"], "context": paragraph["context"], "question": qa["question"], "answers": answers }) with open('output.json', 'w', encoding='utf-8') as fh: json.dump(result, fh, ensure_ascii=False, indent=2)
方案2:原生Python正则预处理(无需第三方依赖)
如果不想安装额外库,可以通过正则区分「作为边界的合法双引号」和「字符串内部的非法双引号」,批量转义内部双引号:
处理逻辑:
合法的JSON字符串边界双引号仅会出现在以下相邻场景:
- 前侧是
{、[、,、:加任意空白字符 - 后侧是任意空白字符加
}、]、,、:
先把这些合法双引号替换为临时标记,剩下的双引号都是字符串内部的,统一转义后再把临时标记换回双引号即可。
代码示例:
import re import json with open('file.json', 'r', encoding='utf-8') as fh: raw_content = fh.read() # 第一步:替换所有合法边界双引号为临时标记 raw_content = re.sub(r'(?<=[\[{,:]\s*)"', '###LEFT_MARK###', raw_content) raw_content = re.sub(r'"(?=\s*[\]},:])', '###RIGHT_MARK###', raw_content) # 第二步:将剩余的双引号(都是字符串内部的)转义 raw_content = raw_content.replace('"', '\\"') # 第三步:把临时标记换回合法边界双引号 raw_content = raw_content.replace('###LEFT_MARK###', '"').replace('###RIGHT_MARK###', '"') # 现在可以正常解析 data = json.loads(raw_content) # 以下是原有结构转换逻辑,无需修改 result = [] for article in data["data"]: for paragraph in article["paragraphs"]: for qa in paragraph["qas"]: answers = {"text": [answer["text"] for answer in qa["answers"]]} result.append({ "id": qa["id"], "context": paragraph["context"], "question": qa["question"], "answers": answers }) with open('output.json', 'w', encoding='utf-8') as fh: json.dump(result, fh, ensure_ascii=False, indent=2)
大文件优化建议
如果文件体积超过内存上限,可以按行读取流式处理,无需一次性加载全量内容到内存,两种方案都支持流式改造。
内容的提问来源于stack exchange,提问作者futuredataengineer
相关产品推荐
相关产品推荐

