访问自定义JsonValidator中的父字段



我正在使用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...
}

相关内容

  • 没有找到相关文章

最新更新