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

如何将键名无双引号的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:06:32