C#使用YamlDotNet将YAML转JSON时布尔/整数被转成字符串问题求解
问题原因
默认配置下YamlDotNet的反序列化器不会自动识别无引号标量的原生类型,所有值都会被解析为字符串,序列化到JSON时自然会保留字符串格式,导致布尔、数字等类型不符合预期。
解决方案
方案1:开启自动类型识别(无需定义实体类)
修改ConvertirYamlAJson方法的反序列化器配置,添加自动识别原生类型的配置即可:
public static string ConvertirYamlAJson(TextReader yml) { var deserializer = new DeserializerBuilder() // 核心配置:自动尝试将无引号的字符串转换为布尔、数字等对应原生类型 .WithAttemptingUnquotedStringTypeDeserialization() .Build(); var yamlObject = deserializer.Deserialize(yml); var serializer = new SerializerBuilder() .JsonCompatible() .Build(); return serializer.Serialize(yamlObject); }
如果自动识别的覆盖度不够,可以手动添加指定类型的转换器:
var deserializer = new DeserializerBuilder() .WithTypeConverter(new YamlDotNet.Serialization.Converters.BooleanConverter()) .WithTypeConverter(new YamlDotNet.Serialization.Converters.Int32Converter()) .WithTypeConverter(new YamlDotNet.Serialization.Converters.Int64Converter()) .Build();
方案2:绑定实体类(类型最稳定,推荐)
如果YAML结构固定,提前定义对应结构的实体类,反序列化时指定实体类型,从根源上保证类型正确:
- 定义实体结构
public class Contrato { public string CodigoTipoContrato { get; set; } public string Descripcion { get; set; } public string Empresa { get; set; } public List<TipoConcepto> TiposConcepto { get; set; } } public class TipoConcepto { public string CodigoTipoConcepto { get; set; } public string Descripcion { get; set; } public string NaturalezaContable { get; set; } public string PerfilContabilizacion { get; set; } public string GrupoImpuestosArticulo { get; set; } public string CodigoMoneda { get; set; } public bool PermiteCruce { get; set; } }
- 修改反序列化逻辑
public static string ConvertirYamlAJson(TextReader yml) { var deserializer = new DeserializerBuilder().Build(); // 反序列化时指定实体类型 var yamlObject = deserializer.Deserialize<Contrato>(yml); var serializer = new SerializerBuilder().JsonCompatible().Build(); return serializer.Serialize(yamlObject); }
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

