【问题标题】:Parsing unquoted JavaScript object literal as JSON using YAML & JSON modules使用 YAML 和 JSON 模块将不带引号的 JavaScript 对象文字解析为 JSON
【发布时间】:2021-07-13 18:10:54
【问题描述】:

我抓取了一个无法解析为 JSON 的 JavaScript 对象,因为它有未加引号的键。

我在这里找到了一个解决方案,它说使用 PyYaml 库将对象加载为 Python 数据结构,然后将其写回为有效的 JSON:

https://stackoverflow.com/a/31030022/10601287

这对我来说是一个很好的解决方案,但是yaml.load(js_obj) 会导致键和值作为键合并在一起,并导致值默认为“无”。这是我的代码 sn-p:

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
}

任何建议将不胜感激。

【问题讨论】:

  • 您需要在 Python 中执行此操作吗?
  • 是的,很遗憾我这样做了,因为我实际上正在使用一个名为 Knime 的分析软件,我只能使用 Python 脚本。

标签: python json object parsing yaml


【解决方案1】:

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))

当然,如果输入不那么规则,那可能会严重失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2013-05-12
    相关资源
    最近更新 更多