自定义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
相关产品推荐
相关产品推荐

