Python中如何将多层双引号转义的字符串转换为合法dict
问题根源定位
你之前转换失败的核心原因是手中的字符串既不符合标准JSON格式,也不符合Python字面量语法,存在两层结构问题:
- 最外层多了一层单引号包裹,让完整的JSON内容变成了字符串值本身
- 内部的双引号采用了CSV格式的转义规则:用*连续两个双引号
""*代表字符串边界,而非JSON/Python字面量使用的单双引号边界、反斜杠转义规则
这就是为什么直接调用ast.literal_eval会解析出{Source:Test Flow Action}这种非法结构:Python解析器遇到连续两个双引号会识别为空字符串字面量,中间的Source会被当成无引号的变量标识符,最终拼接成不符合字典语法的结构;而json.loads会因为连续双引号不符合JSON格式要求直接抛出解析错误。
具体通用解决步骤
分三步即可完成格式转换,适配你当前的测试场景:
- 先用
ast.literal_eval剥掉最外层的单引号包裹,拿到内部的原始内容串 - 将内部连续的双引号替换为JSON标准的双引号边界,生成合法JSON字符串
- 用
json.loads将标准JSON串转换为合法Python字典
对应可直接运行的代码示例:
import ast import json # 原始待转换字符串 d = '"{""Source"":""Test Flow Action""}"' # 第一步:剥离最外层单引号包裹 inner_content = ast.literal_eval(d) # 此时inner_content的实际值为:{""Source"":""Test Flow Action""} # 第二步:替换连续双引号为JSON标准格式 standard_json_str = inner_content.replace('""', '"') # 替换后字符串为合法JSON结构:{"Source":"Test Flow Action"} # 第三步:转换为Python字典 result = json.loads(standard_json_str) # 最终输出result: {'Source': 'Test Flow Action'}
复杂场景适配
如果后续遇到字符串值内部本身包含双引号的情况(比如字典值为他说"今天天气很好"),直接用字符串替换容易出现转义错位,此时可以借助Python内置的csv模块处理双引号转义逻辑,替换上面第二步的实现即可:
import csv from io import StringIO # 替换第二步的双引号替换逻辑,适配内部带双引号的场景 reader = csv.reader(StringIO(inner_content), quotechar='"', doublequote=True) standard_json_str = next(reader)[0]
内容的提问来源于stack exchange,提问作者Aman Raheja
相关产品推荐
相关产品推荐

