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
相关产品推荐
相关产品推荐

