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

如何在C#中使用YamlDotNet序列化YAML字符串时修改缩进

如何将YAML序列化的缩进从2改为4个字符

我成功生成了YAML字符串,但默认缩进为2个字符,而处理该数据的应用要求缩进为4个字符,尝试调整代码但未成功。

我的代码:

var yamlSerializer = new SerializerBuilder()
    .Build();

string yaml;
using (var writer = new StringWriter())
{
    var _settings = new EmitterSettings();
    Console.WriteLine(_settings.BestIndent);
    _settings.WithBestIndent(4);
    var _emitter = new Emitter(writer, _settings);
    yamlSerializer.Serialize(_emitter, dictionary);
    yaml = writer.ToString();
}

Console.WriteLine(yaml);

当前输出:

cars:
  bmw:
    model: 1 series
    category: coupe
    year: 2008
  nissan:
    model: 300zx
    category: hatchback
    year: 1996
  toyota:
    model: 4runner
    category: suv
    year: 2015
  audi:
    model: a8
    category: sedan
    year: 2017

期望输出:

cars:
    bmw:
        model: 1 series
        category: coupe
        year: 2008
    nissan:
        model: 300zx
        category: hatchback
        year: 1996
    toyota:
        model: 4runner
        category: suv
        year: 2015
    audi:
        model: a8
        category: sedan
        year: 2017

问题原因

EmitterSettings的WithBestIndent方法采用不可变设计,调用后会返回一个新的配置实例,不会修改原对象。你之前的代码仅调用了方法,但未将返回的新实例赋值给_settings,导致缩进设置并未生效。

修改后的代码

var yamlSerializer = new SerializerBuilder()
    .Build();

string yaml;
using (var writer = new StringWriter())
{
    var _settings = new EmitterSettings();
    Console.WriteLine(_settings.BestIndent);
    // 接收WithBestIndent返回的新配置实例
    _settings = _settings.WithBestIndent(4);
    var _emitter = new Emitter(writer, _settings);
    yamlSerializer.Serialize(_emitter, dictionary);
    yaml = writer.ToString();
}

Console.WriteLine(yaml);

或者更简洁的链式写法:

var yamlSerializer = new SerializerBuilder()
    .Build();

string yaml;
using (var writer = new StringWriter())
{
    // 直接链式创建带缩进配置的Emitter
    var _emitter = new Emitter(writer, new EmitterSettings().WithBestIndent(4));
    yamlSerializer.Serialize(_emitter, dictionary);
    yaml = writer.ToString();
}

Console.WriteLine(yaml);

修改后运行代码,生成的YAML会使用4个字符的缩进,完全匹配期望输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:28:13