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

自定义JsonValidator实现咨询:默认验证通过后执行自定义校验的更佳方案

优化自定义JsonValidator的实现方案

你当前通过序列化再解析Schema的方式虽然能实现需求,但会带来不必要的性能开销,还可能丢失Schema中的复杂引用、注释等元数据。以下是两种更优的实现方式:

方式一:直接克隆Schema并移除自定义验证器

通过JSchemaBuilder克隆原Schema,再移除当前自定义验证器类型的实例,避免序列化反序列化的开销:

public override void Validate(JToken value, JsonValidatorContext context)
{
    // 克隆原Schema
    var schemaBuilder = new JSchemaBuilder();
    var defaultSchema = schemaBuilder.Build(context.Schema);
    
    // 移除当前自定义验证器,只保留默认Schema验证逻辑
    defaultSchema.Validators.RemoveAll(v => v.GetType() == GetType());
    
    // 默认验证通过后执行自定义校验
    if (value.IsValid(defaultSchema))
    {
        ValidateInternal(value, context);
    }
}

方式二:添加Schema缓存提升重复验证性能

如果需要多次验证同一Schema,可添加缓存机制避免重复克隆:

private static readonly Dictionary<JSchema, JSchema> _defaultSchemaCache = new Dictionary<JSchema, JSchema>();

public override void Validate(JToken value, JsonValidatorContext context)
{
    if (!_defaultSchemaCache.TryGetValue(context.Schema, out var defaultSchema))
    {
        var schemaBuilder = new JSchemaBuilder();
        defaultSchema = schemaBuilder.Build(context.Schema);
        defaultSchema.Validators.RemoveAll(v => v.GetType() == GetType());
        _defaultSchemaCache[context.Schema] = defaultSchema;
    }
    
    if (value.IsValid(defaultSchema))
    {
        ValidateInternal(value, context);
    }
}

补充说明

  • 两种方式都避免了序列化反序列化的性能损耗,能完整保留原Schema的结构和元数据
  • 缓存方案适合高频验证同一Schema的场景,进一步提升性能
  • 若你的自定义验证器有多个实例,可根据实际情况调整RemoveAll的判断条件(比如通过自定义标识区分)

内容的提问来源于stack exchange,提问作者yury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:13:15