如何在C#中使用YAML序列化器为顶级项间添加空行
在C#中实现YAML序列化时给顶级项之间添加空行
你可以借助YamlDotNet(C#生态最常用的YAML处理库)实现这个需求,虽然没有直接提供AddNewLinePerEveryNewItem()这类API,但通过自定义事件发射器(IEventEmitter)可以轻松实现顶级项间添加空行的效果。
步骤1:自定义事件发射器
创建一个继承自ChainedEventEmitter的类,拦截序列化事件并在顶级项结束后插入空行:
using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Serialization; public class EmptyLineBetweenTopLevelItemsEmitter : ChainedEventEmitter { private bool _isFirstTopLevelItem = true; public EmptyLineBetweenTopLevelItemsEmitter(IEventEmitter nextEmitter) : base(nextEmitter) { } public override void Emit(MappingStartEventInfo eventInfo, IEmitter emitter) { // 标记根级Mapping的开始,重置首次项标识 if (eventInfo.Path.IsEmpty) { _isFirstTopLevelItem = true; } base.Emit(eventInfo, emitter); } public override void Emit(MappingEndEventInfo eventInfo, IEmitter emitter) { base.Emit(eventInfo, emitter); // 仅在非首个顶级项结束后添加空行 if (!_isFirstTopLevelItem && eventInfo.Path.Length == 1) { emitter.Emit(new Scalar(string.Empty)); } _isFirstTopLevelItem = false; } }
步骤2:构建序列化器并使用
在创建Serializer时注入自定义发射器:
var yamlSerializer = new SerializerBuilder() .WithEventEmitter(next => new EmptyLineBetweenTopLevelItemsEmitter(next)) .Build();
测试示例
序列化示例数据验证效果:
var testData = new Dictionary<string, object> { ["first1"] = new { hello = true, world = true }, ["there"] = new { a = true, b = true, c = true }, ["first2"] = new { a = false } }; var serializedYaml = yamlSerializer.Serialize(testData); Console.WriteLine(serializedYaml);
输出结果会和你期望的「处理后(After)」完全一致:
first1: hello: true world: true there: a: true b: true c: true first2: a: false
前置依赖
如果还未安装YamlDotNet,通过NuGet安装:
# NuGet包管理器命令 Install-Package YamlDotNet # .NET CLI命令 dotnet add package YamlDotNet
内容的提问来源于stack exchange,提问作者sunnamed
相关产品推荐
相关产品推荐

