如何使用json.loads处理含转义字符的JSON字符串?加载报错解决
问题:无法加载包含转义双引号的JSON字符串
问题代码
import json from json import loads search = """ [{"text":"Dolores Keane - \"Craigie Hills\" (1982)"}] """ print(loads(search)) # 返回错误 print(search.replace('"',"'")) # 将所有双引号转为单引号,包括转义的和未转义的
问题详情
不知道如何将这类字符串加载为JSON格式。已经尝试了无数方法,比如使用repr(search)等,但都不起作用。
编辑补充:问题在于该字符串中同时存在用于表示字典键/值的双引号(")和作为字符串内容一部分的转义双引号(\"),无法正确区分二者并完成JSON加载。
目前已知两种思路:使用原始字符串、先dump再load。
报错信息
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 2 column 28 (char 28)
解决方案
核心问题
你定义的三重引号字符串里,\"会被Python自动解析成单个双引号,而非JSON要求的转义双引号(\\")。实际传入json.loads()的内容是:
[{"text":"Dolores Keane - "Craigie Hills" (1982)"}]
这种情况下,JSON解析器会误以为字符串在Keane - 后就结束,后续内容语法错误,导致解码失败。
具体解决方法
方法1:使用原始字符串
在三重引号前加r,让Python保留字符串中的原始转义字符:import json search = r""" [{"text":"Dolores Keane - \"Craigie Hills\" (1982)"}] """ print(json.loads(search)) # 输出:[{'text': 'Dolores Keane - "Craigie Hills" (1982)'}]方法2:手动二次转义
如果不能使用原始字符串,就把每个\再转义一次,确保JSON能识别转义的双引号:import json search = """ [{"text":"Dolores Keane - \\"Craigie Hills\\" (1982)"}] """ print(json.loads(search)) # 输出同上方法3:先dump再load
如果你是从Python对象生成字符串,先通过json.dumps()生成标准JSON格式,再加载:import json original_data = [{"text": 'Dolores Keane - "Craigie Hills" (1982)'}] search = json.dumps(original_data) print(json.loads(search)) # 输出同上
注意事项
之前用replace('"', "'")的方法不可行,因为JSON要求键和值必须用双引号,替换后生成的单引号字符串不符合JSON语法规范。
内容的提问来源于stack exchange,提问作者Willem van Houten
相关产品推荐
相关产品推荐

