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

如何替换字符串列表中未转义双引号以解决JSON解析错误

修复JSON字符串中未转义的内部双引号问题

当LLM输出的JSON包含未转义的内部双引号时(比如示例中的"15" deep-dish cast aluminum wheels"),会破坏JSON结构导致json.loads解析失败。以下是两种可靠的修复方法:

方法一:正则表达式替换(适合简单场景)

利用正则匹配字符串内部的未转义双引号,将其替换为转义后的\",核心是区分字符串边界的双引号和内部的双引号:

import re
import json

# 存在问题的JSON字符串
malformed_json = '''{
  "Equipment Contents": [
    "XL APPEARANCE GROUP",
    "body-color grille",
    "body-color body-side molding with chrome insert",
    "luggage rack",
    "15" deep-dish cast aluminum wheels",
    "P235/75R15SL all-terrain OWL tires",
    "power door locks",
    "power windows",
    "power mirrors",
    "cloth captains chairs"
  ]
}'''

# 替换未转义且非字符串边界的双引号
fixed_json = re.sub(r'(?<!\\)"(?!(?:[^"]*"[^"]*")*[^"]*$)', r'\"', malformed_json)

# 验证解析结果
parsed_data = json.loads(fixed_json)
print(parsed_data["Equipment Contents"][4])  # 输出:15" deep-dish cast aluminum wheels

正则规则说明:

  • (?<!\\):负向后断言,确保目标双引号前没有反斜杠,避免转义过的引号被重复处理
  • (?!(?:[^"]*"[^"]*")*[^"]*$):负向前断言,确保目标双引号不是字符串的结束边界(即后续双引号数量为偶数,说明当前引号在字符串内部)

方法二:状态机遍历处理(适合复杂场景)

如果LLM输出的JSON存在更复杂的格式问题(比如字符串含换行、多个内部引号),状态机遍历字符的方式更鲁棒。通过跟踪是否处于字符串内部,精准判断需要转义的双引号:

import json

def fix_unescaped_quotes(malformed_json):
    fixed_chars = []
    in_string = False
    escape_next = False

    for idx, char in enumerate(malformed_json):
        if escape_next:
            fixed_chars.append(char)
            escape_next = False
            continue
        
        if char == '\\':
            fixed_chars.append(char)
            escape_next = True
            continue
        
        if char == '"':
            if not in_string:
                # 进入字符串,添加边界引号
                fixed_chars.append(char)
                in_string = True
            else:
                # 判断是否为字符串结束引号:检查后续字符是否为JSON结构分隔符
                next_idx = idx + 1
                is_closing_quote = False
                if next_idx < len(malformed_json):
                    next_char = malformed_json[next_idx]
                    if next_char in (',', ']', '}', '\n', '\t', ' '):
                        is_closing_quote = True
                
                if is_closing_quote:
                    # 结束引号,不转义,退出字符串状态
                    fixed_chars.append(char)
                    in_string = False
                else:
                    # 内部引号,添加转义符
                    fixed_chars.append('\\')
                    fixed_chars.append(char)
        else:
            fixed_chars.append(char)
    
    return ''.join(fixed_chars)

# 使用示例
malformed_json = '''{
  "Equipment Contents": [
    "XL APPEARANCE GROUP",
    "body-color grille",
    "body-color body-side molding with chrome insert",
    "luggage rack",
    "15" deep-dish cast aluminum wheels",
    "P235/75R15SL all-terrain OWL tires",
    "power door locks",
    "power windows",
    "power mirrors",
    "cloth captains chairs"
  ]
}'''

fixed_json = fix_unescaped_quotes(malformed_json)
parsed_data = json.loads(fixed_json)
print(parsed_data["Equipment Contents"][4])

这种方法逐字符扫描,通过状态标记精准处理每个双引号,能应对绝大多数LLM输出的JSON格式异常。

内容的提问来源于stack exchange,提问作者Wennian Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:05:20