了解YAML

时间:2015-08-17 09:50:00

标签: yaml

我试图理解YAML的基本概念。我没有找到任何可以解决我怀疑的相关文件。例如:

product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
我猜,

product是一个序列:

- sku         : BL394D

作为数据。我已经读过,在YAML中你可以将序列定义为:

name:
 -a
 -b
 -c

我的问题是在product序列中这些值是什么?它们在序列项目之前没有连字符。

      quantity    : 4
      description : Basketball
      price       : 450.00

它们是否也属于key: value的序列或嵌套sku对?我完全糊涂了。通过列表中的列表,地图和嵌套列表示例帮助我理解基本语法,反之亦然。

2 个答案:

答案 0 :(得分:2)

product是两个地图的序列,每个地图都包含skuquantitydescriptionprice条目。

您可以找到一些示例和说明here

答案 1 :(得分:1)

因为键quantity缩进到与sku缩进的同一级别,它们是相同映射的键(因此descriptionprice)。此映射是一个序列元素,它在一个缩进级别引入,小于键缩进的-

写一个可能更清晰的方法就等同于你的例子:

product:
    - 
      sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - 
      sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52

您可以访问数量值的方式当然取决于您使用的语言(以及您可能使用的库)。对于Python下的ruamel.yaml和PyYAML,你可以这样做:

data['product'][0]['quantity']

获取值4

以不同的方式查看(有效)YAML数据通常很有帮助,特别是因为语法有多种形式,而且可能不是很明显

abc:
  - 1
  - 2

是从密钥abc到具有两个值(12)的单个序列的映射,这是等效的:

abc:
- 1
- 2

所以是:

abc: [ 1, 2]

如果您比使用YAML更熟悉JSON表示法或使用其online YAML parser输出,那么查看Python通常会有所帮助。

如果您使用Python,您也可以在本地轻松完成此操作:

import sys
import ruamel.yaml as yaml
import json
from pprint import pprint

yaml_str = """\
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
"""

data = yaml.load(yaml_str)
pprint(data)
print('='*40)
json.dump(data, sys.stdout, indent=2)

会给你:

{'product': [{'description': 'Basketball',
              'price': 450.0,
              'quantity': 4,
              'sku': 'BL394D'},
             {'description': 'Super Hoop',
              'price': 2392.0,
              'quantity': 1,
              'sku': 'BL4438H'}],
 'tax': 251.42,
 'total': 4443.52}
========================================
{
  "product": [
    {
      "sku": "BL394D", 
      "price": 450.0, 
      "description": "Basketball", 
      "quantity": 4
    }, 
    {
      "sku": "BL4438H", 
      "price": 2392.0, 
      "description": "Super Hoop", 
      "quantity": 1
    }
  ], 
  "total": 4443.52, 
  "tax": 251.42
}