You need to enable JavaScript to run this app. C#使用JSON Schema验证YAML时数值转字符串校验失败求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 00:27:03