【问题标题】:How do I parse YAML into a hash/object?如何将 YAML 解析为哈希/对象?
【发布时间】:2013-04-25 19:55:00
【问题描述】:

我有一个 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]

【问题讨论】:

    标签: ruby yaml


    【解决方案1】:

    这是一个哈希。 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

    【讨论】:

      【解决方案2】:

      根本问题是您的 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"}}
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2011-03-29
          • 2020-10-29
          • 2012-03-22
          • 2019-04-04
          • 2010-12-26
          • 1970-01-01
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多