Python中解析特殊JSON字符串为字典数组的正确方法
如何将特殊格式字符串解析为Python字典数组
先看你给出的原始字符串:
raw_str = '[\'{"cx":3575,"cy":1657,"r":98}\', \'{"cx":3284,"cy":1706,"r":81}\', \'{"cx":4260,"cy":1611,"r":97}\', \'{"cx":3350,"cy":1632,"r":60}\', \'{"cx":3475,"cy":1586,"r":77}\', \'{"cx":4243,"cy":1474,"r":87}\']'
这个字符串存在几个格式问题:外层由单引号包裹,内部双引号被转成了HTML实体",每个字典元素还被转义单引号\'包裹。下面提供两种可行的处理方案:
方案一:字符串预处理 + JSON解析
手动修正字符串格式后,用JSON模块完成解析:
import json raw_str = '[\'{"cx":3575,"cy":1657,"r":98}\', \'{"cx":3284,"cy":1706,"r":81}\', \'{"cx":4260,"cy":1611,"r":97}\', \'{"cx":3350,"cy":1632,"r":60}\', \'{"cx":3475,"cy":1586,"r":77}\', \'{"cx":4243,"cy":1474,"r":87}\']' # 将HTML实体的双引号替换为真实双引号 processed_str = raw_str.replace('"', '"') # 去掉外层单引号,同时移除内部的转义单引号 processed_str = processed_str[1:-1].replace("'", "") # 重新拼接为合法的JSON数组格式 valid_json = f"[{processed_str}]" # 解析为字典数组 result = json.loads(valid_json) # 验证结果 print(result) print(type(result)) # 输出 <class 'list'> print(type(result[0])) # 输出 <class 'dict'>
方案二:用ast模块解析(更健壮)
ast模块能正确识别转义字符,处理逻辑更省心:
import ast import json raw_str = '[\'{"cx":3575,"cy":1657,"r":98}\', \'{"cx":3284,"cy":1706,"r":81}\', \'{"cx":4260,"cy":1611,"r":97}\', \'{"cx":3350,"cy":1632,"r":60}\', \'{"cx":3475,"cy":1586,"r":77}\', \'{"cx":4243,"cy":1474,"r":87}\']' # 替换HTML实体 processed_str = raw_str.replace('"', '"') # 用ast解析成字符串列表 str_list = ast.literal_eval(processed_str) # 逐个将字符串解析为字典 result = [json.loads(item) for item in str_list] # 验证结果 print(result)
两种方案对比:
- 方案一流程直观,适合简单场景,但如果字符串结构有变动,可能需要调整预处理逻辑
- 方案二更健壮,ast能处理各种转义情况,适配复杂格式的字符串
内容的提问来源于stack exchange,提问作者Dmitry Sokolov
相关产品推荐
相关产品推荐

