我正在使用Newtonsoft出色的JsonSchema库,并试图为greaterthanfield
另一个字段验证构建一个自定义验证器。
为了做到这一点,我显然需要访问Validate(JToken value, JsonValidatorContext context)
方法中的另一个字段。然而,存在的JToken
没有任何父信息,无法找到所需的同级。同样,JsonValidatorContext
没有任何对验证数据的引用,只有模式。
我希望能够:value.Parent["siblingkey"]
,但看起来JToken
实际上只是一个令牌,无法访问其余解析数据。
有人知道实现这样一个验证器的方法吗?引用其他字段的字段。其他例子可能是combinedmaxlength
等…
我一直在玩,因为我遇到了同样的问题
我发现自定义验证器系统有一些奇怪的行为,其中JToken树是基于您的验证器可以验证的最高父节点重新构建的(其中CanValidate返回true)
这意味着,如果我们可以欺骗系统,使其相信您的验证器可以验证根令牌和您的特定令牌,则您的树将被水合。
public class TestValidator : JsonValidator
{
public override bool CanValidate(JSchema schema)
{
// we assume every schema has a title/schemaversion in its root object.
return schema.Title != null || schema.SchemaVersion != null || schema.ExtensionData.ContainsKey("greaterthanfield");
}
public override void Validate(JToken value, JsonValidatorContext context)
{
// we should ignore the "root token validation"
if (!context.Schema.ExtensionData.ContainsKey("greaterthanfield"))
return;
// value.Parent is hydrated now
}
}
我刚刚遇到了这个问题。我在属性级别上应用自定义验证器(使用"格式"),但不起作用。
{
"$schema": "http://json-schema.org/draft-04/schema",
"title": "JSON Schema for custom rule",
"type": "object",
"properties": {
"Prop1": {
"type": "string"
},
"Prop2": {
"type": "string",
"format": "YourCustomValidatorName"
}
}
}
相反,您需要将自定义验证器应用于整个模式。
{
"$schema": "http://json-schema.org/draft-04/schema",
"title": "JSON Schema for custom rule",
"type": "object",
"properties": {
"Prop1": {
"type": "string"
},
"Prop2": {
"type": "string"
}
},
"format": "YourCustomValidatorName"
}
然后在您的自定义验证器类中,您将能够访问的所有属性
public override void Validate(JToken value, JsonValidatorContext context)
{
var prop1 = value.SelectToken("..Prop1")?.Value<string>();
var prop2 = value.SelectToken("..Prop2")?.Value<string>();
// Rest of your logic...
}