You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:57:03