如何在YAML中实现嵌套映射的多层合并?
YAML 多层嵌套映射合并的原生解决方法
原始YAML定义
.a: &a sheep: "a" .b : &b cow: "a" edileMamals: &edible_mamals << : *a << : *b edibleAnimals: &edible_animals mamals: << : *edible_mamals fish: salmon: "a" tuna: "a"
需求与尝试
想要基于edibleAnimals创建allAnimals,并扩展其中的mamals和fish字段,初始写法如下:
allAnimals: << : *edible_animals mamals: horse: "a" fish: dolphin: "a"
实际结果
allAnimals: mamals: horse: "a" fish: dolphin: "a"
预期结果
allAnimals: mamals: sheep: "a" cow: "a" horse: "a" fish: salmon: "a" tuna: "a" dolphin: "a"
问题:已知YAML的合并键<<会直接覆盖同层级的键,而非递归合并嵌套映射,有没有通用的原生方法实现多层嵌套的合并?
原生解决方案
YAML 1.2原生并不支持递归合并嵌套映射的语法,<<合并仅作用于当前层级的键值对,遇到同名键会直接覆盖,不会深入嵌套结构处理。
要实现预期效果,只能在嵌套层级上单独使用合并键,明确指定要继承的映射:
方案1:直接引用嵌套锚点(需解析器支持)
allAnimals: mamals: <<: *edible_mamals # 先合并原有可食用哺乳动物 horse: "a" # 再添加新的哺乳动物 fish: <<: *edible_animals.fish # 合并原有鱼类 dolphin: "a" # 添加新的鱼类
方案2:提前给嵌套节点定义锚点(兼容所有解析器)
如果你的YAML解析器不支持*edible_animals.fish这种嵌套锚点引用,可以提前给fish单独定义锚点:
edibleAnimals: &edible_animals mamals: << : *edible_mamals fish: &edible_fish salmon: "a" tuna: "a" allAnimals: mamals: <<: *edible_mamals horse: "a" fish: <<: *edible_fish dolphin: "a"
这种方式是YAML原生语法能实现嵌套合并的唯一途径——在每个需要扩展的嵌套映射层级上,显式使用<<合并对应的锚点,再添加新的键值对。
内容的提问来源于stack exchange,提问作者Gleb Nebolyubov
相关产品推荐
相关产品推荐

