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

Groovy YamlSlurper是否支持YAML锚点与别名?

Groovy的YamlSlurper是否支持YAML锚点与别名?

是的,Groovy的YamlSlurper默认确实不支持解析YAML的锚点(&)和别名(*)。从你提供的测试代码结果就能明显看出:别名*SS被直接当作字符串"SS"处理,没有映射到锚点&SS对应的"Sammy Sosa"值。

原因分析

Groovy的YamlSlurper底层依赖Jackson的YAML处理模块,而Jackson在默认配置下,会因为JSON本身不支持锚点/别名语法,将YAML的别名节点直接转换为锚点名称的字符串,而非解析为对应的引用值。尽管Jackson依赖的SnakeYAML本身支持锚点解析,但Jackson对其的默认封装并没有开启这个功能。

解决方案

方案1:直接使用SnakeYAML库

跳过Groovy的YamlSlurper,直接用SnakeYAML原生API处理,它能完美支持锚点和别名解析:

import org.yaml.snakeyaml.Yaml

def yamlContent = """
---
hr:
- Mark McGwire
# Following node labeled SS
- &SS Sammy Sosa
rbi:
- *SS # Subsequent occurrence
- Ken Griffey
"""
def result = new Yaml().load(yamlContent)
println result

执行后会输出期望结果:

[hr:[Mark McGwire, Sammy Sosa], rbi:[Sammy Sosa, Ken Griffey]]

方案2:配置Jackson的YAMLMapper启用锚点支持

如果必须基于Jackson生态(比如和Groovy现有代码兼容),可以手动配置YAMLMapper开启锚点解析功能:

import com.fasterxml.jackson.dataformat.yaml.YAMLMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory

def yamlFactory = new YAMLFactory()
def mapper = YAMLMapper.builder(yamlFactory)
    .enable(com.fasterxml.jackson.dataformat.yaml.YAMLParser.Feature.ALLOW_YAML_ANCHORS)
    .build()

def yamlContent = """
---
hr:
- Mark McGwire
- &SS Sammy Sosa
rbi:
- *SS
- Ken Griffey
"""
def result = mapper.readValue(yamlContent, Map.class)
println result

这段代码同样能正确解析锚点和别名,输出符合预期的结果。

内容的提问来源于stack exchange,提问作者Rami Ojares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:52:15