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
相关产品推荐
相关产品推荐

