如何通过SnakeYaml控制YAML转储时的缩进(含列表项缩进)
调整SnakeYAML输出列表的缩进方案
我完全理解你的需求——默认情况下SnakeYAML转储的行内列表会紧贴着键的冒号,比如list: - "first item" - "second item",你希望给每个列表项的-前多增加几个空格,达到list: - "first item" - "second item"的效果。
SnakeYAML确实没有直接提供配置项来控制这个细节,但我们可以通过自定义Dumper类重写输出逻辑来实现,不需要修改resolver或representer(它们负责的是节点解析和类型映射,和输出格式无关)。
针对行内列表(同一行)的解决方案
如果你的默认输出是行内流风格的列表,我们可以重写Dumper的writeFlowSeqItem方法,在每个列表项的-前插入额外的空格:
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Dumper; import org.yaml.snakeyaml.nodes.Node; public class CustomFlowListIndentDumper extends Dumper { private final int extraSpaceCount; // 构造函数,传入你想要额外增加的空格数量 public CustomFlowListIndentDumper(DumperOptions options, int extraSpaceCount) { super(options); this.extraSpaceCount = extraSpaceCount; } @Override protected void writeFlowSeqItem(Node itemNode) { // 先写入指定数量的额外空格,再输出默认的"- " write(" ".repeat(extraSpaceCount) + "- "); processNode(itemNode, null); } }
然后在使用时,用这个自定义Dumper替换默认的:
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.representer.Representer; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class YamlIndentDemo { public static void main(String[] args) { // 配置Dumper为行内流风格(和你的默认输出一致) DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.FLOW); // 创建自定义Dumper,额外增加2个空格 CustomFlowListIndentDumper dumper = new CustomFlowListIndentDumper(options, 2); Representer representer = new Representer(options); Yaml yaml = new Yaml(representer, dumper); // 测试数据 Map<String, Object> data = new HashMap<>(); data.put("list", Arrays.asList("first item", "second item")); // 输出结果 System.out.println(yaml.dump(data)); } }
运行后你会得到预期的输出:
{list: - "first item" - "second item"}
针对块风格列表(换行)的扩展方案
如果你需要的是换行的块风格列表,且列表项比默认多缩进,可以重写writeListItem方法:
@Override protected void writeListItem(Node itemNode) { // 先输出默认缩进,再额外加2个空格 writeIndent(); write(" "); write('-'); write(' '); processNode(itemNode, null); write('\n'); }
设置options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK)后,输出会变成:
list: - "first item" - "second item"
这种方式的核心是直接干预SnakeYAML的输出流写入逻辑,完全控制列表项前的空格数量,不会影响YAML的解析正确性。
内容的提问来源于stack exchange,提问作者Adrian Kaczmarek




