使用JsonSchema.Net在C#中进行JSON验证时遇到的问题求助
解决JsonSchema.Net在C#反序列化验证中的两个问题
问题1:ValidatingJsonConverter未抛出必填字段缺失的异常
- 先确认转换器注册和配置细节:
- 用
System.Text.Json时,必须在JsonSerializerOptions里添加转换器,同时开启属性名称大小写不敏感匹配——很多时候字段不匹配是因为JSON里的小写字段和模型的大写属性没对应上,代码示例:var options = new JsonSerializerOptions(); options.Converters.Add(new ValidatingJsonConverter()); options.PropertyNameCaseInsensitive = true; - 检查
[Required]特性的命名空间:必须用System.ComponentModel.DataAnnotations.RequiredAttribute,别搞混其他库的同名特性。 - 验证Schema是否正确生成:手动打印Schema的JSON,确认里面包含
"required": ["LastName", "BirthDate"]项,代码:var schema = JsonSchema.FromType<Person>(); Console.WriteLine(schema.ToJson()); - 手动配置验证失败的异常抛出:默认转换器可能不会主动抛异常,得自己加回调逻辑:
var converter = new ValidatingJsonConverter(); converter.OnValidationFailed = (context, results) => { if (!results.IsValid) throw new JsonException($"验证失败:{string.Join(",", results.Messages)}"); }; options.Converters.Add(converter);
- 用
问题2:schema.Evaluate返回IsValid=false但无错误信息
- 开启错误收集选项:调用
Evaluate时必须传入EvaluationOptions并设置CollectErrors = true,否则不会收集错误详情,代码示例:var schema = JsonSchema.FromType<Person>(); var jsonDoc = JsonDocument.Parse("{\"FirstName\": \"John\"}"); var evalOptions = new EvaluationOptions { CollectErrors = true }; var results = schema.Evaluate(jsonDoc.RootElement, evalOptions); if (!results.IsValid) { foreach (var error in results.Errors) { Console.WriteLine($"错误:{error.Message},路径:{error.InstanceLocation}"); } } - 确认Schema生成正确性:如果Schema里根本没有
required规则,验证肯定不会报对应错误,还是用前面打印Schema的方法检查。 - 检查JSON实例的验证路径:如果是嵌套JSON,要确保验证的是正确的根元素,别因为实例路径不对导致错误信息无法关联。
内容的提问来源于stack exchange,提问作者Zulukas
相关产品推荐
相关产品推荐

