我抓取了一个JavaScript对象,因为它有未引用的键,所以我无法将其解析为JSON。
我在这里找到了一个解决方案,它说使用PyYaml库将对象加载为Python数据结构,然后将其写回有效的JSON:
https://stackoverflow.com/a/31030022/10601287
这对我来说将是一个很好的解决方案,然而yaml.load(js_obj)
导致密钥&值合并为一个键,并使该值默认为"None"。这是我的代码片段:
import yaml
yaml_obj = yaml.safe_load(js_obj)
print(yaml_obj)
加载为YAML之前的JavaScript对象示例(实际上它比这个大得多(:
{
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.load(js_obj(之后:
{
'path:"1/83656/83659/83669/83670"': None,
'is_active:!0': None,
'level:4': None,
'children_count:0': None,
'product_count:59': None,
'parent_id:83669': None,
'name:"Red Wine"': None,
'position:1': None,
'id:83670': None,
'include_in_menu:1': None,
'url_key:"red-wine-83670"': None,
'url_path:"liquor/wine/red-wine.html"': None,
'_score:null': None,
'slug:"red-wine-83670"': None
}
如有任何建议,我们将不胜感激。
YAML要求映射中的冒号后面至少跟一个空格字符,所以您的输入也不是有效的YAML。如果格式像您的示例所示的那样简单,您可以通过在后面跟着冒号的行的开头搜索一个单词并在冒号后面插入一个空格来将其预处理为YAML。(或者你可以在单词周围插入引号,使其成为JSON,但is_active:!0,
会有问题,因为!0
不是JSON值。(
所以你可以试试这样的东西:
import re
first_word = re.compile(r"^s*[_a-zA-Z]w*:")
# ...
yaml_obj = yaml.load(first_word.replace(r"g<0> ", js_obj))
当然,如果输入不太规律,那可能会失败得很惨。