读取JSON时ast.literal_eval返回无效语法错误,无法修改源文件如何解决
错误原因
ast.literal_eval是按照Python字面量的语法规则解析输入的,而JSON字符串的转义规则和Python字面量规则存在差异:你调用json.dumps生成的JSON字符串里,xml属性的双引号是用\"转义的,当这个字符串传入ast.literal_eval时,Python解析器会先把\"转义为普通双引号,最终导致字符串被内部的双引号意外截断,触发语法错误。
且你当前的操作逻辑存在冗余:注释标注json_file已经是JSON文件读取完成后的Python对象,完全不需要再做序列化+反序列化的额外操作。
可行解决方法
- 方案1(最推荐,无额外性能损耗):直接使用已经解析完成的
json_file对象,删掉val = ast.literal_eval(json.dumps(json_file))这行冗余代码即可,不需要做任何额外处理。 - 方案2(如果你拿到的是未解析的原始JSON文本):使用标准JSON库解析,不要用ast.literal_eval,示例代码:
import json with open('目标JSON文件路径', 'r', encoding='utf-8') as f: # 直接用json.load解析,原生支持JSON转义规则,不会触发报错 val = json.load(f) print(val)
- 方案3(确有特殊场景必须使用ast.literal_eval):预处理字符串转义,再传入ast.literal_eval,示例代码:
import json import ast # 先序列化,再对内部双引号做二次转义适配Python语法规则 json_str = json.dumps(json_file).replace('\\"', '\\\\"') val = ast.literal_eval(json_str) print(val)
- 方案4(预处理原始文本,不需要修改源文件):读取JSON文件内容后先在内存中替换XML属性的双引号为单引号,再做解析,示例代码:
import json with open('目标JSON文件路径', 'r', encoding='utf-8') as f: raw_content = f.read() # 内存中替换属性双引号为单引号,不修改源文件 processed_content = raw_content.replace('vers=\\"', "vers='").replace('\\" >', "' >") val = json.loads(processed_content) print(val)
内容的提问来源于stack exchange,提问作者rohan
相关产品推荐
相关产品推荐

