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

使用YAML与JSON模块解析无引号键的JavaScript对象字面量为JSON的异常问题咨询

解决无引号键的JavaScript对象解析问题(PyYAML键值合并修复)

问题原因分析

你遇到的问题其实是YAML语法规则和JavaScript对象语法不匹配导致的:

  • 首先,YAML要求键值对必须用键: 值(冒号后加空格)的格式,但你的JS对象里是键:值(冒号后无空格),PyYAML会把整个key:"value"字符串当成一个单独的键,自动给它分配None作为值。
  • 其次,JS里的特殊语法(比如!0表示true)在YAML中不被识别,会进一步干扰解析逻辑。

方案1:用JSON5直接解析(推荐)

JSON5是JSON的超集,原生支持JavaScript对象的语法(包括无引号键、!0/null等),完全不需要手动修改字符串。

首先安装json5库:

pip install json5

然后用下面的代码解析:

import json5

# 你的JavaScript对象字符串
js_obj = '{ path:"1/83656/83659/83669/83670", is_active:!0, level:4, children_count:0, product_count:59, parent_id:83669, name:"Red Wine", position:1, id:83670, include_in_menu:1, url_key:"red-wine-83670", url_path:"liquor/wine/red-wine.html", _score:null, slug:"red-wine-83670" }'

# 直接解析为Python字典
data = json5.loads(js_obj)

# 转换为标准JSON字符串
json_str = json.dumps(data, indent=2)
print(json_str)

这个方法最省心,不需要处理任何语法转换,直接就能得到正确的Python结构和标准JSON。

方案2:修复JS字符串后用PyYAML解析

如果你坚持要用PyYAML,需要先把JS字符串转换成符合YAML语法的格式:

  1. 给所有无引号的键加上引号;
  2. 在冒号后添加空格;
  3. 把JS的!0替换成YAML能识别的true。

可以用正则表达式来完成这些替换:

import re
import yaml
import json

def convert_js_to_yaml_compatible(js_str):
    # 给无引号的键加双引号,并在冒号后添加空格
    js_str = re.sub(r'(\w+):', r'"\1": ', js_str)
    # 替换JS的!0为YAML的true
    js_str = js_str.replace('!0', 'true')
    return js_str

js_obj = '{ path:"1/83656/83659/83669/83670", is_active:!0, level:4, children_count:0, product_count:59, parent_id:83669, name:"Red Wine", position:1, id:83670, include_in_menu:1, url_key:"red-wine-83670", url_path:"liquor/wine/red-wine.html", _score:null, slug:"red-wine-83670" }'

# 转换为兼容YAML的字符串
fixed_str = convert_js_to_yaml_compatible(js_obj)
# 加载为Python字典
yaml_obj = yaml.safe_load(fixed_str)
# 转成标准JSON
json_str = json.dumps(yaml_obj, indent=2)
print(json_str)

这个方法需要手动处理语法差异,但也能解决问题,适合不能安装额外库的场景。

内容的提问来源于stack exchange,提问作者Nancy Collins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:22:37