如何替换特定引号为撇号?修复JSON字符串适配json.loads
修复格式错误的JSON字符串
问题分析
原JSON字符串的核心问题是值字段"hammer 1.5""中存在未转义的多余双引号,违反JSON语法规范,导致json.loads无法解析。我们需要编写通用函数处理所有类似的未转义双引号场景。
通用解决方案
方案1:转义值中的未转义双引号(推荐)
该方案通过正则精准匹配值字段内的未转义双引号,添加反斜杠转义,严格符合JSON规范,适配所有值内出现未转义引号的场景:
import re import json def fix_malformed_json(raw_json_str): # 先将HTML实体"转换为普通双引号 str_with_quotes = raw_json_str.replace('"', '"') # 正则匹配:值字段内(": "之后、", "或"}"之前)的未转义双引号 pattern = re.compile(r'(?<=": ")([^"]*)"(?=[",}])') # 对匹配到的内容中的双引号进行转义 def escape_quotes(match): return match.group(1).replace('"', '\\"') + '"' fixed_json = pattern.sub(escape_quotes, str_with_quotes) return fixed_json # 测试示例 original_str = '{"name": "hammer 1.5"", "brand": "Eurosteel"}' fixed_str = fix_malformed_json(original_str) # 输出修正后的JSON字符串:{"name": "hammer 1.5\"", "brand": "Eurosteel"} parsed_dict = json.loads(fixed_str) print(parsed_dict) # 输出: {'name': 'hammer 1.5"', 'brand': 'Eurosteel'}
方案2:合并连续双引号为单个(适用于连续多余引号场景)
如果多余的双引号是连续出现的,可直接替换连续双引号为单个,逻辑更简单:
import json def fix_consecutive_quotes(raw_json_str): # 转换HTML实体并替换连续双引号 fixed_str = raw_json_str.replace('"', '"').replace('""', '"') return fixed_str # 测试示例 original_str = '{"name": "hammer 1.5"", "brand": "Eurosteel"}' fixed_str = fix_consecutive_quotes(original_str) parsed_dict = json.loads(fixed_str) print(parsed_dict) # 输出: {'name': 'hammer 1.5"', 'brand': 'Eurosteel'}
方案对比
- 方案1:通用性强,能处理值内任意位置的未转义双引号(非连续场景也适用),完全符合JSON语法规范。
- 方案2:仅适用于多余引号连续出现的情况,处理逻辑简洁,但场景局限性大。
内容的提问来源于stack exchange,提问作者french_fries
相关产品推荐
相关产品推荐

