You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过SnakeYaml控制YAML转储时的缩进(含列表项缩进)

调整SnakeYAML输出列表的缩进方案

我完全理解你的需求——默认情况下SnakeYAML转储的行内列表会紧贴着键的冒号,比如list: - "first item" - "second item",你希望给每个列表项的-前多增加几个空格,达到list: - "first item" - "second item"的效果。

SnakeYAML确实没有直接提供配置项来控制这个细节,但我们可以通过自定义Dumper重写输出逻辑来实现,不需要修改resolver或representer(它们负责的是节点解析和类型映射,和输出格式无关)。

针对行内列表(同一行)的解决方案

如果你的默认输出是行内流风格的列表,我们可以重写DumperwriteFlowSeqItem方法,在每个列表项的-前插入额外的空格:

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

火山引擎 最新活动