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
相关产品推荐
相关产品推荐

