You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:46:09