YAML以身作则

时间:2016-02-20 09:59:25

标签: yaml

我正在尝试为我的应用设计配置文件格式并选择了YAML。但是,这(显然)意味着我需要能够定义,解析和验证正确的YAML语法!

在配置文件中,必须有一个名为widgets的集合/序列。此序列需要包含一组类型化的小部件(可能的类型为fizzbuzzfoobaz)。每个小部件还具有name和各种其他属性(取决于类型)。例如:

myappconfig.yaml
================
widgets:
  - buzz:
      name: Red Buzz
      isSilly: true
  - buzz:
      name: Blue Buzz
      isSilly: false
  - foobaz:
      name: Abracadabra
      rating: 3000
      specialty: Such YAML much amaze

我的简单问题是:我上面创建了一个正确/有效的YAML文件吗?意思是,基于我的约束,我是否在我的实现中正确理解了YAML语法?

2 个答案:

答案 0 :(得分:3)

您可以查看YAML的语法,例如on this website

您的YAML解析如下:

{'widgets': [{'buzz': {'name': 'Red Buzz', 'isSilly': True}}, {'buzz': {'name': 'Blue Buzz', 'isSilly': False}}, {'foobaz': {'rating': 3000, 'name': 'Abracadabra', 'specialty': 'Such YAML much amaze'}}]}

看起来像你似乎想要的那样。

答案 1 :(得分:1)

如果窗口小部件名称应该是唯一的,则可以将其用于键:

widgets:
  RedBuzz:
    type: buzz
    isSilly: true
  BlueBuzz:
    type: buzz
    isSilly: false
  Abracadabra:
    type: foobaz
    rating: 3000
    specialty: Such YAML much amaze

这个按小部件类型使用分组:

widgets:
  buzz:
    - RedBuzz:
        isSilly: true
    - Blue Buzz:
        isSilly: false

  foobaz:
    - Abracadabra:
        rating: 3000
        specialty: Such YAML much amaze

此外,如果您感到讨厌,可以使用小部件类型合并,如下所示:

buzz_widget: &buzz_widget
  type: buzz

foobaz_widget: &foobaz_widget
  type: foobaz

widgets:
  RedBuzz:
      isSilly: true
      <<: *buzz_widget
  BlueBuzz:
      isSilly: false
      <<: *buzz_widget
  Abracadabra:
      rating: 3000
      specialty: Such YAML much amaze
      <<: *foobaz_widget

对我来说,最好使用嵌套键值结构(对于非原始元素)。解析为地图后,您始终可以将其作为集合访问。同时,您具有唯一约束和持续访问时间(按键)。如果您的密钥不应该是唯一的,那么您应该在返回序列之前尝试重构它。