从YAML创建嵌套对象,以通过Ruby中的方法调用访问属性

时间:2015-02-14 23:49:08

标签: parsing yaml openstruct

我对红宝石完全不熟悉。 我必须解析一个YAML文件来构造一个对象

YAML文件

projects:
  - name: Project1
    developers:
      - name: Dev1
        certifications:
          - name: cert1
      - name: Dev2
        certifications:
          - name: cert2
  - name: Project2
    developers:
      - name: Dev1
        certifications:
          - name: cert3
      - name: Dev2
        certifications:
          - name: cert4

我想从这个YAML创建一个对象,我在Ruby中编写了以下代码

require 'yaml'
object = YAML.load(File.read('./file.yaml'))

我可以使用[]成功访问此对象的属性 例如,

puts object[projects].first[developers].last[certifications].first[name]
# prints ABC

但是,我想通过方法调用

访问属性

例如

puts object.projects.first.developers.last.certifications.first.name
# should print ABC

有没有办法构造这样一个对象,其属性可以用上面提到的(点)方式访问? 我读过有关OpenStructhashugar的文章。 我也想避免使用第三方宝石

1 个答案:

答案 0 :(得分:3)

来自Xavier的答案很好,但它可以更短,只需要yaml,json和ostruct并解析你的YAML,将它转换为JSON,在一个Openstruct中解析它(一个Struct也可能)就像这样

object = JSON.parse(YAML.load(yaml).to_json, object_class: OpenStruct)

从文件加载YAML

object = JSON.parse(YAML::load_file("./test.yaml").to_json, object_class: OpenStruct)

这给出了

object
=>#<OpenStruct projects=[#<OpenStruct name="Project1", developers=[#<OpenStruct name="Dev1", certifications=[#<OpenStruct name="cert1">]>, #<OpenStruct name="Dev2", certifications=[#<OpenStruct name="cert2">]>]>, #<OpenStruct name="Project2", developers=[#<OpenStruct name="Dev1", certifications=[#<OpenStruct name="cert3">]>, #<OpenStruct name="Dev2", certifications=[#<OpenStruct name="cert4">]>]>]>
object.projects.first.developers.last.certifications.first.name 
=>cert2

我使用它来从文件加载配置,Yaml很容易维护,在你的代码中它比Hash中的配置更容易使用。

不要为重复性任务执行此操作。