You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:45:03