Vert.x Json Schema
Vert.x Json Schema组件提供了一个异步可扩展的 Json Schema 规范实现。 你可以使用 Json Schema 去验证每一个json结构的数据。该组件提供以下特性:
-
实现了 draft 2020-12
-
实现了 draft 2019-09
-
实现了 draft 7
-
实现了 draft 4
-
$ref
解析和缓存的引用解除 -
通过DSL来构建schemas
使用 Vert.x Json Schema
为了使用 Vert.x Json Schema ,需要在构建配置文件中添加如下 依赖:
-
Maven (在
pom.xml
文件中):
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-json-schema</artifactId>
<version>4.3.8</version>
</dependency>
-
Gradle (在
build.gradle
文件中):
dependencies {
compile 'io.vertx:vertx-json-schema:4.3.8'
}
相关概念
JsonSchema
Schemas可以两种形式存在:
-
基于 JSON 表达形式的 JSON 对象
-
基于
true/false
布尔值
JsonSchema
接口同时兼容这两种类型,
无需频繁检查类型。
Schema 存储仓库/Repository
SchemaRepository
包含 link:../../apidocs/io/vertx/json/schema/JsonSchema.html [JsonSchema]
实例。
它将执行解除引用模式以加快验证速度。
该存储仓库是一个简单的密钥存储,这表示着它不允许出现重复的 ID。
存储仓库随后创建 Validator
实例并获取存储仓库中所有的从属(sub)schemas。
验证器
顾名思义,Validator
使用一个起始 schema 以验证对象。
输出格式则取决于配置。
解析schema
使用多个schemas或从属/子/sub schemas时,建议使用 Repository 存储仓库
。
要解析 schema,您需要一个 JsonSchema
以及一些初始配置。
由于schemas可以包含引用,因此验证器和存储仓库需要获取您的应用程序的 baseUri 基础通用资源识别号
。
这允许您在其他从属/子/sub schemas中引用您自己的schemas。出于解除引用的目的,您无需配置草稿/draft。
SchemaRepository repository =
SchemaRepository.create(new JsonSchemaOptions().setBaseUri("https://vertx.io"));
您可以将 JsonSchema
实例用于不同的 Validator 验证器
,
且可直接使用 JsonParser
解析不同的 JsonSchema
。
现在你可以解析schema了:
JsonSchema schema = JsonSchema.of(object);
// Or
repository.dereference(JsonSchema.of(object));
重要
|
请记住,出于安全原因,此模块不会尝试下载任何引用的子schema/sub-schema。 所有必需的 sub-schemas 应提供给存储仓库/repository 对象。 |
验证
鉴于 json-schema 的动态特性以及有条件的 if-then-else
,其无法在流式传输中开展验证。
由于这个原因,验证是一个阻塞操作。
如果您的验证过程非常耗时,那么建议在专用线程池上运行验证或使用 executeBlocking
。
一个schema可以有两种状态:
验证一个schema:
OutputUnit result = Validator.create(
schema,
new JsonSchemaOptions().setDraft(Draft.DRAFT7))
.validate(json);
if (result.getValid()) {
// Successful validation
}
用代码来构建schema
如果你想要使用代码来构建schema,你可以使用附带的DSL。目前只有Draft-7支持这个特性。
创建schema
在 Schemas
内部提供了schema创建的静态方法:
SchemaBuilder intSchemaBuilder = intSchema();
SchemaBuilder objectSchemaBuilder = objectSchema();
使用关键词
对于每一个schema,你是否可以使用 Keywords
方法来构建关键词,
这取决于schema的类型:
stringSchema()
.with(format(StringFormat.DATETIME));
arraySchema()
.with(maxItems(10));
schema() // 生成同时接收数组和整数的schema
.with(type(SchemaType.ARRAY, SchemaType.INT));
定义schema的结构
根据你创建的schema,你可以定义结构。
使用属性schema和其他属性schema来创建一个对象类型的schema:
objectSchema()
.requiredProperty("name", stringSchema())
.requiredProperty("age", intSchema())
.additionalProperties(stringSchema());
创建一个数组类型的schema:
arraySchema()
.items(stringSchema());
创建元组类型的schema:
tupleSchema()
.item(stringSchema()) // 第一个元素
.item(intSchema()) // 第二个元素
.item(booleanSchema()); // 第三个元素
$ref
和 别名
你可以使用 Schemas.ref
方法来添加一个 $ref
schema。
通过 id
来指定对应schema的 $id
关键词。
你也可以使用别名来引用通过dsl定义的schema。你可以使用 alias
来为一个schema设置别名。
这样你就可以使用 Schemas.refToAlias
来根据别名引用schema。
intSchema()
.alias("myInt");
objectSchema()
.requiredProperty("anInteger", refToAlias("myInt"));
使用schema
定义完schema后,您可调用 toJson
以返回schema的 JSON 表达:
JsonObject schema = objectSchema()
.requiredProperty("name", stringSchema())
.requiredProperty("age", intSchema())
.additionalProperties(stringSchema())
.toJson();