C#使用JSON Schema验证YAML时数值转字符串校验失败求助
问题根因
YamlDotNet默认初始化的无类型反序列化器,会将所有YAML标量值默认解析为字符串类型存入字典结构,导致后续序列化JSON时丢失原始的数值、布尔等类型信息,和JSON Schema中定义的类型规则不匹配。
解决方案
方案1:开启自动类型推断(推荐)
使用DeserializerBuilder构建反序列化器,开启未引号字符串的类型自动推断能力,YamlDotNet会自动将未加引号的数值、布尔值匹配为对应的C#基础类型,无需修改其他逻辑:
var schemaJson = File.ReadAllText(schemaPath); var schema = Newtonsoft.Json.Schema.JSchema.Load(new JsonTextReader(new StringReader(schemaJson))); // 仅修改反序列化器初始化部分 var deserializer = new YamlDotNet.Serialization.DeserializerBuilder() // 开启未引号字符串的类型自动推断 .WithAttemptingUnquotedStringTypeDeserialization() .Build(); var data = deserializer.Deserialize(new StringReader(yaml)); var sb = new StringBuilder(); var sw = new StringWriter(sb); var serializer = new Newtonsoft.Json.JsonSerializer(); serializer.Serialize(sw, data); Newtonsoft.Json.Linq.JObject.Parse(sb.ToString()).Validate(schema);
修改后示例YAML中的age字段会被解析为int类型,序列化到JSON时会输出不带引号的数字27,即可通过JSON Schema的整数类型校验。
方案2:手动注册类型转换器(适配自定义规则场景)
如果自动推断不能满足业务需求(比如有特定格式的数值、需要兼容带引号的数字等),可以手动注册指定类型的转换器,强制控制解析规则:
var deserializer = new YamlDotNet.Serialization.DeserializerBuilder() .WithTypeConverter(new YamlDotNet.Serialization.Converters.Int32Converter()) .WithTypeConverter(new YamlDotNet.Serialization.Converters.Int64Converter()) .WithTypeConverter(new YamlDotNet.Serialization.Converters.BooleanConverter()) .WithTypeConverter(new YamlDotNet.Serialization.Converters.DoubleConverter()) .Build();
内容的提问来源于stack exchange,提问作者Dylan Smith
相关产品推荐
相关产品推荐

