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

Python中如何不使用正则解析带多余引号的无效JSON字符串

问题根因

json.loads()和json.dumps()失效的核心原因有两个:

  • 字段外层额外包裹了一层双引号,把整个结构化内容变成了普通字符串值,不属于合法JSON结构的一部分
  • 内层的键和值全部使用单引号包裹,不符合标准JSON的语法要求(标准JSON仅支持双引号包裹键和字符串值),原生json模块无法直接解析这种Python字典风格的字符串
无正则最简解决方案

直接使用Python标准库自带的ast.literal_eval()即可,不需要安装第三方依赖,也不需要写正则匹配,全程安全无注入风险。
ast.literal_eval()专门用于安全解析Python原生字面量结构(字典、列表、字符串、数字、元组等),不会像eval()一样执行任意传入代码,完全适配当前场景。

完整处理代码如下:

import ast
import json

# 替换成从数据源实际拿到的details字段原始值
raw_details_value = '''"{
'col1': 'col1_details',
'col2': 'col2_details',
'col3': 'col3_details'
}"'''

# 1. 剥离外层多余的包裹双引号
dict_format_str = raw_details_value.strip('"')

# 2. 直接解析为Python结构化字典对象
parsed_details = ast.literal_eval(dict_format_str)

解析完成后parsed_details就是标准的Python字典对象,可以直接把它放回整体数据结构,再通过json.dumps()导出,最终得到的JSON里details字段就是结构化对象,不会再被识别为字符串。

解析结果验证:

print(type(parsed_details))
# 输出:<class 'dict'>

print(json.dumps(parsed_details, indent=2, ensure_ascii=False))

输出为标准JSON格式:

{
  "col1": "col1_details",
  "col2": "col2_details",
  "col3": "col3_details"
}
注意事项
  • 绝对不要用eval()做同类解析,eval()会执行传入字符串里的任意代码,存在严重的代码注入安全隐患
  • 如果原始数据外层包裹的引号前后存在空白字符,strip('"')会自动忽略前后空白再剥离引号,不影响解析结果
  • 后续如果数据源输出格式能调整,直接输出标准双引号JSON字符串的话,就可以跳过这层解析,直接用json.loads()处理

内容的提问来源于stack exchange,提问作者Vyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:33:21