首页 > 解决方案 > YAML 中名称值对的分层列表

问题描述

在 YAML 中表示如下名称值对的分层列表的最佳方式是什么:

name_1: value_1
  subName1_1: subValue1_1 
  subName1_2: subValue1_2 
name_2: value_2
  subName2_1: subValue2_1 
  subName2_2: subValue2_2 
name_3: value_3
  subName3_1: subValue3_1 
  subName3_2: subValue3_2 
name_4: value_4
  subName4_1: subValue4_1 
  subName4_2: subValue4_2 

我正在考虑以下内容,但不确定这是否是最好的方法:

-  name_1:
      ID: 1
      subNames:
         -  subName1_1:
               ID: 1
         -  subName1_2:
               ID: 2
-  name_2:
      ID: 2
      subNames:
         -  subName2_1:
               ID: 1
         -  subName2_2:
               ID: 2

或者我也可以这样做:

-   Name: Name_1
    ID: 1
    SubNames:
      - SubName: subName1_1
        ID: 1
      - SubName: subName1_2
        ID: 2

-   Name: Name_2
    ID: 2
    SubNames:
      - SubName: subName2_1
        ID: 1
      - SubName: subName2_2
        ID: 2

我需要 name_* 以及它们对应的值是唯一的,所以我更喜欢 python 可以轻松使用的东西来验证没有重复。

标签: yamlpyyaml

解决方案


那么有值键类型。它不是为 YAML 1.1 定义的标准的一部分,但它旨在解决这个问题。它建议您基本上在名为的映射中有一个值,=其中包含默认值:

name_1:
  =: value_1
  subName1_1: subValue1_1 
  subName1_2: subValue1_2 
name_2:
  =: value_2
  subName2_1: subValue2_1 
  subName2_2: subValue2_2 
name_3:
  =: value_3
  subName3_1: subValue3_1 
  subName3_2: subValue3_2 
name_4:
  =: value_4
  subName4_1: subValue4_1 
  subName4_2: subValue4_2

或者,您可以将值设为包含单个 key_value 对的列表:

name_1:
  - value_1
  - subName1_1: subValue1_1 
  - subName1_2: subValue1_2 
name_2:
  - value_2
  - subName2_1: subValue2_1 
  - subName2_2: subValue2_2 
name_3:
  - value_3
  - subName3_1: subValue3_1 
  - subName3_2: subValue3_2 
name_4:
  - value_4
  - subName4_1: subValue4_1 
  - subName4_2: subValue4_2

您可以使用流序列编写此代码,因为 YAML 允许流序列包含单个键值对,这些键值对将被解释为隐式映射:

name_1: [value_1,
  subName1_1: subValue1_1,
  subName1_2: subValue1_2]
name_2: [value_2,
  subName2_1: subValue2_1,
  subName2_2: subValue2_2]
name_3: [value_3,
  subName3_1: subValue3_1,
  subName3_2: subValue3_2]
name_4: [value_4,
  subName4_1: subValue4_1,
  subName4_2: subValue4_2]

请注意,当您这样做时,子名称中不能有任何类型的块样式节点,但其他流节点会很好。


推荐阅读