如何在YamlDotNet序列化时去除特殊字符字符串的单引号适配Azure Pipelines
解决YamlDotNet序列化空数组适配Azure Pipelines的问题
核心问题在于你把**空数组的字符串表示"[]"**当成普通字符串序列化,但Azure Pipelines需要的是YAML原生空数组类型,而非字符串。正确思路是调整数据类型而非修改字符串序列化规则,具体实现如下:
1. 调整模型属性类型(推荐方案)
将dependsOn的属性类型从string改为string[]或List<string>,无依赖项时直接赋值为空数组,而非字符串"[]"。
示例模型:
public class PipelineConfig { public string[] dependsOn { get; set; } // 其他业务属性... }
序列化代码:
var serializer = new SerializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) // 适配Azure Pipelines小驼峰命名 .ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull) .Build(); var config = new PipelineConfig { dependsOn = Array.Empty<string>(), // 赋值空数组 // 其他属性赋值 }; var yaml = serializer.Serialize(config);
输出的YAML会自动符合要求:
dependsOn: []
如果是单个依赖(比如"foo"),直接给数组赋值new[] { "foo" },会输出dependsOn: [foo],也符合Azure Pipelines的格式要求。
2. 兼容混合场景(字符串/空数组)
如果业务中dependsOn既可能是单个字符串,又可能是空数组,可以用object类型配合自定义转换器处理:
自定义类型转换器
public class DependsOnConverter : IYamlTypeConverter { public bool Accepts(Type type) { return type == typeof(object); } public object ReadYaml(IParser parser, Type type) { // 按需实现反序列化逻辑 throw new NotImplementedException(); } public void WriteYaml(IEmitter emitter, object value, Type type) { if (value is string str) { emitter.Emit(new Scalar(str)); } else if (value is IEnumerable<string> list && !list.Any()) { // 输出空数组 emitter.Emit(new SequenceStart(null, null, false, SequenceStyle.Flow)); emitter.Emit(new SequenceEnd()); } else if (value is IEnumerable<string> nonEmptyList) { // 输出非空数组 emitter.Emit(new SequenceStart(null, null, false, SequenceStyle.Flow)); foreach (var item in nonEmptyList) { emitter.Emit(new Scalar(item)); } emitter.Emit(new SequenceEnd()); } } }
注册转换器并序列化
var serializer = new SerializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) .WithTypeConverter(new DependsOnConverter()) .Build(); // 单个依赖场景 var singleDepConfig = new PipelineConfig { dependsOn = "foo" }; // 空依赖场景 var emptyDepConfig = new PipelineConfig { dependsOn = Array.Empty<string>() };
对应输出分别为:
dependsOn: foo
dependsOn: []
关键注意点
不要尝试强制把字符串"[]"序列化为无引号格式,这会破坏YAML语法规则,YamlDotNet的引号包裹是为了区分字符串与原生YAML类型,直接使用对应数据类型才是最稳妥的适配方式。
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

