我通过扩展现有的 json-schema 版本 202012 创建自定义元架构 json 文件。如何使 json-schema-validator 使用此自定义元架构而不是 202012 中的默认架构方言?
问题详情:
我在本地创建了一个名为“my_custom_meta_schema.json”的 JSON 文件,其中包含以下内容:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://domain/meta-schema/myschema/v1/schema",
"$vocabulary": {
"https://json-schema.org/draft/2020-12/vocab/core": true,
"https://json-schema.org/draft/2020-12/vocab/applicator": true,
"https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
"https://json-schema.org/draft/2020-12/vocab/validation": true,
"https://json-schema.org/draft/2020-12/vocab/meta-data": true,
"https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
"https://json-schema.org/draft/2020-12/vocab/content": true
},
"$dynamicAnchor": "meta",
"title": "Core and Validation specifications meta-schema",
"allOf": [
{"$ref": "meta/core"},
{"$ref": "meta/applicator"},
{"$ref": "meta/validation"},
{"$ref": "meta/format-annotation"},
{"$ref": "meta/content"}
],
"type": ["object", "boolean"],
"properties": {
"minDate": {
"type": "string",
"pattern": "\\d\\d\\d\\d-\\d\\d-\\d\\d",
"format": "date"
}
}
}
现在,我将创建一个使用上述元架构的架构,它将以以下内容开头:
{
"$schema": "https://domain/meta-schema/myschema/v1/schema",
"$id": "https://domain/retail/product.schema",
...
}
我正在使用networknt的json-schema-validator
implementation ("com.networknt:json-schema-validator:1.4.0")
如何使
JsonSchemaFactory
使用自定义元架构而不是默认元架构?
我当前的函数使用默认的 202012 Draft 。但我想使用我的自定义元架构(从 202012 版本扩展)进行验证
我当前的功能(当前不使用自定义元架构):
fun validateData(jsonData: Map<String, Any>): List<String> {
val jsonSchemafactory : JsonSchemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012)
val config = SchemaValidatorsConfig()
val objectMapper: ObjectMapper = ObjectMapper()
config.pathType = PathType.JSON_POINTER
val jsonSchemaInputStream: InputStream = resourceLoader.getResource("classpath:my_schema.json").inputStream
val jsonNode: JsonNode = objectMapper.valueToTree(jsonData)
val jsonSchema = jsonSchemafactory.getSchema(jsonSchemaInputStream)
val validationResults = jsonSchema.validate(jsonNode)
if (validationResults.isEmpty()) {
println("Validation successful")
} else {
println("Validation failed")
validationResults.forEach {
println(it.message)
}
}
return validationResults.asSequence().map { it.message }.toList()
}
可能为时已晚,无法帮助OP,但对于像我一样登陆此页面的其他人,您可以定义一个自定义
JsonSchemaFactory
(包括自定义元模式)并从中获取您的实例:
https://github.com/networknt/json-schema-validator/blob/master/doc/validators.md#custom-validators
此讨论中有更多上下文:https://github.com/networknt/json-schema-validator/issues/32
我自己还没有尝试过这种方法,我只会添加一个自定义关键字而不是整个元模式,但这至少应该提供一个起点。