使用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语法的格式:
- 给所有无引号的键加上引号;
- 在冒号后添加空格;
- 把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
相关产品推荐
相关产品推荐

