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

