我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

使用Lateapexearlyspeed.Json.Schema实现库的Fluent Schema Builder模式验证复杂JSON数据

来源:网络 更新时间:2024-05-31 15:32:26

对于验证复杂JSON数据是否合法的需求,通常的解决方式是使用标准JSON Schema。在.NET平台上,有对应的JSON Schema实现库,应用程序通常需要将标准JSON schema传入实现库,来进行后续的数据验证。然而,有一种情况是,如果使用者不太了解标准JSON Schema格式,却希望在自己的service中使用其强大的功能,或者适配需要JSON Schema的其他service。

解决方案

如果对标准JSON Schema不太熟悉,可以使用Lateapexearlyspeed.Json.Schema 实现库的fluent schema builder模式来创建JSON Schema验证器。

这种fluent schema builder用法的接口设计思路与标准json schema的格式和命名不完全一致。标准JSON Schema虽然强大,但许多开发者更熟悉“强类型”风格。因此,实现库的fluent schema builder在配置时会先“问”用户他们期望哪种JSON token类型,然后在后续链式调用时会基于当前限定的JSON token类型继续“追问”相关的验证需求。通过这种调用方式,开发者会写出更安全的验证代码,并且利用IDE会有更友好的使用体验。以下是一个示例:

var b = new JsonSchemaBuilder();
b.ObjectHasProperty("A", b => b.IsJsonString().HasMinLength(5))
.HasProperty("B", b => b.IsJsonNumber().IsGreaterThan(1).IsLessThan(10))
.HasProperty("C", b => b.IsJsonArray().HasMinLength(5).HasItems(b =>
{
    b.NotJsonNull();
}))
.HasProperty("D", b => b.Or(
    b => b.IsJsonFalse(),
    b => b.IsJsonNumber().Equal(0),
    b => b.IsJsonObject().HasCustomValidation((JsonElement element) => element.GetProperty("Prop").ValueKind == JsonValueKind.True, 
        jsonElement => $"Cannot pass my custom validation, data is {jsonElement}")
    )
);
JsonValidator jsonValidator = b.BuildValidator();
jsonValidator.Validate(...);

看起来风格是不是很熟悉,即使没接触过JSON Schema,相信也能理解上面的.NET代码。

目前fluent schema builder模式下支持的验证方法有:

  • NotJsonNull
  • IsJsonTrue
  • IsJsonFalse
  • IsJsonBoolean
  • IsJsonNull
  • IsJsonString:
    • Equal
    • IsIn
    • HasMaxLength
    • HasMinLength
    • HasPattern
    • HasCustomValidation
    • NotMatch
    • EndsWith
  • StringEqual
  • StringHasPattern
  • IsJsonNumber:
    • Equal
    • IsIn
    • IsGreaterThan
    • IsLessThan
    • NotGreaterThan
    • NotLessThan
    • MultipleOf
    • HasCustomValidation
  • IsJsonArray:
    • SerializationEquivalent
    • HasItems
    • HasLength
    • HasMaxLength
    • HasMinLength
    • HasUniqueItems
    • HasCustomValidation
    • Contains
    • NotContains
    • Equivalent
    • HasCollection
    • Empty
    • NotEmpty
    • Single
  • ArrayHasItems
  • ArrayContains
  • IsJsonObject:
    • SerializationEquivalent
    • HasProperty
    • HasCustomValidation
    • Equivalent
    • HasNoProperty
  • ObjectHasProperty
  • Or

其中还有HasCustomValidation() overloads 重载方法可以为JSON树中的指定节点创建更高级的自定义验证需求。

不仅想验证JSON数据,还想用代码Build出来的Json验证器来生成JSON Schema?

也可以的

string standardJsonSchema = jsonValidator.GetStandardJsonSchemaText();

注意:为了支持更高级和友好的验证体验,尽管Lateapexearlyspeed.Json.Schema 实现库在其内部实现时尽可能使用标准JSON Schema keywords,但一些Build方法会用到“扩展”keywords。因此,当你用了那些Build()生成了JsonValidator实例后,将不支持调用GetStandardJsonSchemaText(),因为扩展keywords无法返回标准JSON Schema且被其他application所认识。

var builder = new JsonSchemaBuilder();
builder.IsJsonNumber().HasCustomValidation((double _) => true, _ => "");
JsonValidator jsonValidator = builder.BuildValidator();

Assert.Throws(() => jsonValidator.GetStandardJsonSchemaText());

牵扯到扩展keywords的Build方法有:

  • HasCustomValidation(...)
  • HasNoProperty()
  • NotContains()
  • StartsWith()
  • EndsWith()

总结

对于验证JSON数据方面的复杂需求,可以用JSON Schema解决。

对于不希望直接交互JSON Schema格式的service来说,可以用.NET下的Lateapexearlyspeed.Json.Schema实现库的fluent schema builder模式,通过编写代码的形式生成JSON验证器。

对于希望用强类型风格的代码生成JSON Schema的需求,也可以使用Lateapexearlyspeed.Json.Schema实现库的fluent schema builder模式。

Github repo: https://github.com/lateapexearlyspeed/Lateapexearlyspeed.JsonSchema ,欢迎将使用时发现的问题提到issue。