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

Python解析含非法"的JSON字符串报错,求最优解决方案

处理JSON字符串中值内的非法引号问题

当你尝试解析包含未转义引号的JSON字符串时,json.loads()会因为引号作为分隔符的次数异常抛出JSONDecodeError,比如这段代码:

import json

string = '{"key1":"my"value","key2":"my"value2"}'
js = json.loads(string, strict=False)

执行后会报错:json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 13 (char 12),原因是值内部的引号没有转义,破坏了JSON的结构规则。

你当前用多次replace标记合法引号、处理非法引号的方法虽然可行,但步骤繁琐,容易遗漏边界场景,维护成本高。下面提供两种更简洁可靠的解决方案:

方案一:正则表达式替换非法引号

利用正则匹配出值内部的非法引号(即不是键/值边界的引号),将其转义后再解析:

import json
import re

raw_string = '{"key1":"my"value","key2":"my"value2"}'

# 匹配值内部的非法引号:引号前不是冒号,且后不是逗号/大括号
fixed_string = re.sub(r'(?<![:])"(?![:,}])', r'\"', raw_string)

# 正常解析
result = json.loads(fixed_string)
print(result)  # 输出: {'key1': 'my"value', 'key2': 'my"value2'}

这个正则表达式的逻辑是:只匹配那些既不是值开头(前面没有冒号)、也不是值结尾(后面没有逗号/大括号)的引号,将其替换为转义后的\",确保JSON结构合法。

方案二:状态机遍历处理

如果需要更精准地处理复杂场景(比如值内包含特殊字符组合),可以用状态机遍历字符串,标记是否处于值内部,遇到非法引号时自动转义:

import json

def fix_illegal_json_quotes(raw_str):
    str_list = list(raw_str)
    in_value = False
    str_len = len(str_list)
    
    for i in range(str_len):
        char = str_list[i]
        if char == '"':
            if not in_value:
                # 进入值的起始引号
                in_value = True
            else:
                # 检查是否是值的结束引号(后面跟着逗号或大括号)
                if i + 1 < str_len and str_list[i+1] in (',', '}'):
                    in_value = False
                else:
                    # 非法引号,添加转义符
                    str_list[i] = '\\"'
    return ''.join(str_list)

# 使用示例
raw_string = '{"key1":"my"value","key2":"my"value2"}'
fixed_string = fix_illegal_json_quotes(raw_string)
result = json.loads(fixed_string)
print(result)  # 输出: {'key1': 'my"value', 'key2': 'my"value2'}

这种方法通过跟踪是否处于值的内部状态,能更灵活地处理各种边界情况,比如值内包含多个连续非法引号的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:40:40