含单引号类JSON字符串转列表对象的通用解决方案求助
解决方案
要处理这种含未转义单引号的类JSON字符串,核心是先修复字符串中的语法错误(转义字符串内部的单引号),再用ast.literal_eval解析——它支持单引号包裹的字典/列表结构,比json模块更灵活。
步骤1:实现通用解析函数
用正则匹配所有被单引号包裹的字符串内容,转义内容内部的单引号,避免破坏字典结构:
import re import ast def parse_quoted_string(s): # 转义单引号包裹内容里的内部单引号 def escape_inner_quotes(match): content = match.group(1) return f"'{content.replace(\"'\", \"\\\\'\")}'" # 修复字符串语法 fixed_str = re.sub(r"'(.*?)'", escape_inner_quotes, s, flags=re.DOTALL) # 安全解析为Python对象 return ast.literal_eval(fixed_str)
步骤2:测试使用
把目标字符串传入函数即可:
original_str = "[{'long_name': 'Sample's Road', 'short_name': 'Sample's Rd', 'types': ['route']}, {'long_name': 'England', 'short_name': 'England', 'types': ['boo', 'far']}]" result = parse_quoted_string(original_str) print(result) # 输出: # [{'long_name': "Sample's Road", 'short_name': "Sample's Rd", 'types': ['route']}, {'long_name': 'England', 'short_name': 'England', 'types': ['boo', 'far']}]
通用性说明
- 兼容有无单引号的场景:没有未转义单引号时,正则替换不会修改原内容;
- 适配任意键值对数量、嵌套结构(比如示例中的列表嵌套),只要是类Python字典/列表的单引号包裹结构;
ast.literal_eval是安全解析,避免了eval的代码注入风险。
为什么之前的方法失效?
json.loads:强制要求键和值用双引号包裹,不支持单引号结构,且对引号转义要求严格;ast.literal_eval:原字符串未转义的单引号会导致字符串提前结束,触发语法错误;split()/strip():只能处理简单字符串分割,无法应对嵌套的字典/列表结构,极易破坏数据。
内容的提问来源于stack exchange,提问作者calvin99999
相关产品推荐
相关产品推荐

