【问题标题】:Why is this incorrect YAML syntax?为什么这是不正确的 YAML 语法?
【发布时间】:2012-03-06 08:28:43
【问题描述】:

我在 Ruby on Rails 中运行一个程序,并在 YAML 中设置了一组哈希值。我得到一个 ArgumentError 显然是因为在同一行上有一个左大括号作为前一个哈希的右大括号。

例如,我有:

features: [
  {
    name: lorem ipsum,
    bullets: [
      "bullet 1",
      "bullet 2"
    ]
  },{
    name: lorem ipsum 2,
    bullets: [
    ...
  }
]

它给了我错误。但是,当我将左大括号放在新行上时,如下所示:

  },
  {
    name: lorem ipsum 2,
    ...

它工作正常。

我正在使用 Ruby v. 1.8.7、Rails v. 3.2.1 和 Rails Config v. 0.2.4 读取 YAML 文件并在我的应用程序中访问它。

任何想法如何让 YAML 接受我的语法而不用后一种方式?

【问题讨论】:

  • 我有点惊讶它完全有效;这是非典型的 YAML。
  • 这看起来像是一些邪恶的 YAML 和 JSON 混合体。
  • YAML 现在是 json 的超集(参见 yaml.org/spec/1.2
  • 另见: yaml.org/spec/1.2/spec.html(上一项是 404)

标签: ruby-on-rails ruby-on-rails-3 yaml


【解决方案1】:

YAML 不使用大括号、方括号等。相反,所有内容都已按原样解析为哈希,您只需在列表项前插入连字符:

features:
- name: lorem ipsum
  bullets:
  - bullet 1
  - bullet 2
- name: lorem ipsum 2
  bullets:
  - ...

加载它会给你:

{"features"=>[
  {
    "name"=>"lorem ipsum", 
    "bullets"=>["bullet 1", "bullet 2"]
  },
  {
    "name"=>"lorem ipsum 2",
    "bullets"=>["..."]
  }
]}

【讨论】:

  • 根据目前的YAML spec,YAML确实有大括号和方括号。
【解决方案2】:

Ruby 1.8 使用 Syck 库来解析 yaml,它只实现了 YAML 规范的 1.0 版(并且也没有维护等)。

使用支持 yaml 规范 1.1 版的更新的 YAML 解析器(例如 psych,在 ruby​​ 1.9 中可用),您的文件可以解析。做吧

require 'psych'
require 'yaml'

确保您使用的是 psych(检查 YAML::ENGINE 的值)。不过 ruby​​ 1.8 似乎不支持 psych

但是,至少在 ruby​​ 世界中,yaml 看起来有点不寻常——Dylan 对它的重新格式化更为常见。 根据spec 的说法,yaml 这些天实际上是 JSON 的超集(它已经通过了我!)

【讨论】:

  • 有趣。我应该在哪里放置这些行并检查 YAML::ENGINE 的值?
  • Bundler 实际上会为您执行此操作,因此当您升级到 1.9(并且只要您的机器安装了 libyaml)时,应该会为您调用它。检查 YAML::ENGINE 只是为了排除任何其他重置您选择的 YAML 引擎的情况(例如延迟作业的版本
【解决方案3】:

问题中的 YAML 不是惯用的,但实际上几乎是合法的。 YAML 需要在第 8 行缺少的列表中的逗号后有一个空格。

更正 YAML:

features: [
  {
    name: lorem ipsum,
    bullets: [
      "bullet 1",
      "bullet 2"
    ]
  }, {
    name: lorem ipsum 2,
    bullets: []
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2021-10-05
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多