JSON 模式验证 - networknt json-schema-validator :如何使用自定义元模式进行验证

问题描述 投票:0回答:1

我通过扩展现有的 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()
       }

jsonschema json-schema-validator
1个回答
0
投票

可能为时已晚,无法帮助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

我自己还没有尝试过这种方法,我只会添加一个自定义关键字而不是整个元模式,但这至少应该提供一个起点。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.