如何将YAML解析为哈希/对象?

10

我有一个YAML文件,其中有几个条目看起来像这样:

001:
  :title: Some title
  :description: Some body text maybe
002:
  :title: Some title
  :description: Some body text maybe
我正在使用以下 Ruby 方法将 YAML 文件解析为一组我可以迭代的对象:

我正在使用以下 Ruby 方法将 YAML 文件解析为一组我可以迭代的对象:

def parse_yaml(file)
  YAML::load(File.open(File.join(settings.yaml_folder, file)))
end

def use_yaml
  @items = parse_yaml('items.yml')
  @items.each do |item|
    x = item[1][:title]
    etc...
  end
end

现在,那个方法可以工作,但我觉得很奇怪需要使用item [1] [:title]来访问我正在迭代的对象的属性。 我如何构建我的YAML文件或解析代码,以允许我使用更标准的item[:title]

3个回答

8
这是一个哈希表。 parse_yaml 的输出如下:
{ 1=>
      { :title=>"Some title",
        :description=>"Some body text maybe"},
  2=> { :title=>"Some title",
        :description=>"Some body text maybe" }
}

您可以使用each_value方法,如下所示:
#...
@items = parse_yaml('items.yml')
@items.each_value do |item|
    x = item[:title]
    # ... etc
end

Recomend: YAML for Ruby


7

根本问题在于您的YAML文件将数据存储为哈希值,并尝试像数组一样访问它。

要将数据转换为数组格式:

---
- :title: Some title
  :description: Some body text maybe
- :title: Some title
  :description: Some body text maybe

值得注意的是,你需要使用item[1][:title]来引用你的items,这是因为YAML.load会将键001002转换成整数。

在irb中可以进行确认:

irb(main):015:0> YAML.load(File.open("./test.yml"))
=> {1=>{:title=>"Some title", :description=>"Some body text maybe"}, 2=>{:title=>"Some title", :description=>"Some body text maybe"}}

1
你的YAML是哈希的序列化,因此你可以这样做:
@items.each do |key, item|
  #do something with item[:title]
end

或者将您的YAML更改为以下内容:

- :title: blah
  :description: description
- :title: second title
  :description: second description

这将导致YAML.load返回一个数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接