2013-05-01 52 views
7

我有一个看起来像这样的几个条目YAML文件:如何将YAML解析为散列/对象?

001: 
    :title: Some title 
    :description: Some body text maybe 
002: 
    :title: Some title 
    :description: Some body text maybe 

我使用下面的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]

回答

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 

建议更换:YAML for Ruby

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返回一个数组。

3

根本问题是您的YAML文件将您的数据存储为散列,并尝试像数组一样访问它。

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

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

另外值得注意的,你不得不使用item[1][:title]引用您的项目的原因是,按键001002被YAML.load转换为整数。

你可以在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"}}