You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:03:15