使用Python处理JSON值内双引号:修复无效JSON字符串问题
解决无效JSON字符串的双引号问题
嘿,这个问题我之前处理过,简直是JSON解析里的经典坑!咱们一步步来搞定它~
问题根源
你给出的JSON字符串{"name": "John"s Garage", "company": "ABC"}之所以无效,是因为值John"s Garage里的双引号没有转义——JSON语法要求字符串内部的双引号必须用反斜杠\转义,否则解析器会把这个双引号当成字符串的结束标记,直接报错。
而且要注意:在Python里直接写这个字符串的时候也会触发语法错误,所以得用三引号或者正确转义来表示这个无效的原始字符串(比如用'''{"name": "John"s Garage", "company": "ABC"}''')。
两种可行解决方案
方案1:转义值内的双引号(保留引号)
如果需要保留John"s里的双引号,我们可以用正则表达式精准匹配值内部的未转义双引号,给它们加上转义符:
import re import json # 正确表示无效的原始JSON字符串 bad_json = '''{"name": "John"s Garage", "company": "ABC"}''' # 正则匹配值内的未转义双引号并转义 fixed_json = re.sub(r'(?<="[^"]*)"(?=[^"]*")', r'\"', bad_json) # 验证解析结果 try: parsed_data = json.loads(fixed_json) print("解析成功!结果:", parsed_data) # 输出:解析成功!结果: {'name': 'John"s Garage', 'company': 'ABC'} except json.JSONDecodeError as e: print("解析失败:", e)
正则表达式说明:
(?<="[^"]*):正向预查,确保目标双引号前面是一个边界双引号 + 任意非双引号字符(?=[^"]*"):正向预查,确保目标双引号后面是任意非双引号字符 + 一个边界双引号- 这样就能精准定位到值内部的双引号,不会误改键值对的边界引号
方案2:移除值内的双引号(不需要保留引号)
如果不需要保留那个双引号,直接移除更简单,同样用正则匹配目标引号替换为空字符串:
import re import json bad_json = '''{"name": "John"s Garage", "company": "ABC"}''' # 移除值内的未转义双引号 fixed_json = re.sub(r'(?<="[^"]*)"(?=[^"]*")', '', bad_json) try: parsed_data = json.loads(fixed_json) print("解析成功!结果:", parsed_data) # 输出:解析成功!结果: {'name': 'Johns Garage', 'company': 'ABC'} except json.JSONDecodeError as e: print("解析失败:", e)
扩展场景
如果你的JSON里有多个值内的双引号(比如{"name": "John"s "Best" Garage", "company": "ABC"}),上面的正则也能完美处理,会把所有值内部的未转义引号都转义/移除,生成有效的JSON。
内容的提问来源于stack exchange,提问作者user544079
相关产品推荐
相关产品推荐

