如何将键名无双引号的JS数组字符串转换为Python字典列表
问题解答
你不需要从零编写复杂正则逐字符处理,有两类成熟方案可以实现转换,按可靠性从高到低排序如下:
方案1:使用JS对象字面量专用解析库(推荐,准确率最高)
第三方库demjson3天生支持解析非严格JSON格式的JS对象结构,可以自动识别未加双引号的键名、JS原生布尔值、数字等值类型,不需要手动做字符串替换,基本不会出现误匹配问题。
使用步骤:
- 安装依赖:
pip install demjson3 - 解析代码:
import demjson3 # 替换为你拿到的完整JS数组字符串,注意补全数组末尾缺失的闭合括号] js_raw = """ [{leervorm:"K", id:"48941AA9EE5AB0A1C1258526005CC082", lpzr:"", stap:1, hybride:true, training:[{locatie: "Eindhoven", periode:"07-07-2022, 08-07-2022, 14-07-2022 en 15-07-2022", prijs: 2095, id: "CAFA0A05F5576E3BC125875E004B739A", key: "AZ-104-220707-E"}]}, {leervorm:"B", id:"AAA64F74CB6F76CEC125853D00343484", lpzr:"", stap:2, hybride:true, training:[{locatie: "Eindhoven", periode:"08-06-2022, 15-06-2022 en 22-06-2022", prijs: 1695, id: "60826A0CC72D9F4FC125875E00352909", gaatdoor: 2, key: "BT-AZ-104-220608-E"}]}] """ py_list = demjson3.decode(js_raw) # 输出结果就是Python字典组成的列表,可直接使用
方案2:正则修正+标准库解析(无第三方依赖场景使用)
如果运行环境不允许安装额外包,可以用针对性正则把JS语法修正为合法JSON格式,再用标准库json解析即可,不需要写完整的解析逻辑。
正则只会匹配键名位置的标识符,不会修改字符串值内部的普通文本:
import re import json js_raw = """ [{leervorm:"K", id:"48941AA9EE5AB0A1C1258526005CC082", lpzr:"", stap:1, hybride:true, training:[{locatie: "Eindhoven", periode:"07-07-2022, 08-07-2022, 14-07-2022 en 15-07-2022", prijs: 2095, id: "CAFA0A05F5576E3BC125875E004B739A", key: "AZ-104-220707-E"}]}, {leervorm:"B", id:"AAA64F74CB6F76CEC125853D00343484", lpzr:"", stap:2, hybride:true, training:[{locatie: "Eindhoven", periode:"08-06-2022, 15-06-2022 en 22-06-2022", prijs: 1695, id: "60826A0CC72D9F4FC125875E00352909", gaatdoor: 2, key: "BT-AZ-104-220608-E"}]}] """ # 给{或逗号之后、冒号之前的无引号键名包裹双引号 fixed_json_str = re.sub(r'([{,]\s*)([a-zA-Z_][a-zA-Z0-9_]*)(\s*:)', r'\1"\2"\3', js_raw) py_list = json.loads(fixed_json_str)
注意:这个方案有适用边界,如果字符串值内部出现
{/逗号 + 标识符 + 冒号的结构,可能出现误替换,这类场景必须用方案1保证解析准确性。
原有方法解析失败的原因
json、simplejson默认只解析严格符合RFC规范的JSON,要求所有对象键必须用双引号包裹,原始输入的键名没有引号,不符合解析要求。ast.literal_eval仅识别Python原生字面量语法,除了要求键名带引号,还要求布尔值为大写True/False,和JS语法规则不匹配,因此无法直接解析。
内容的提问来源于stack exchange,提问作者Sev
相关产品推荐
相关产品推荐

