【问题标题】:networknt schema validator $id $ref not working in json schemanetworknt 模式验证器 $id $ref 在 json 模式中不起作用
【发布时间】:2021-10-16 06:36:44
【问题描述】:

我正在为我的项目使用 networknt json 模式验证器。 我在其他 json 模式文件中定义了一个 json 模式和更多定义。 但是当我使用对其他 json 文件的引用时,验证器会抛出 no json schema found (file not found ) 异常。 我让我的 id 看起来像 URL(当然不能通过网络访问,因为它只是 id) 但似乎 networknt 验证器试图检索架构,将其视为 URL? 标准 json 模式文档说 id 不一定是网络可访问的,所以我不确定它为什么要尝试获取它。 无论如何,我想了解如何为 json 模式文件创建 $id 和 $ref 以使其工作。

示例架构 1:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com /schema/profileparcel/cedge/system/banner/post/request_schema.json",
  "title": "Banner Parcel Schema",
  "description": "Banner profile parcel schema for POST request",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "data": {
      "type": "object",
      "properties": {
        "login": {
          "type": "object",
          "$ref": "#/$defs/oneOfOptionsDef"
        },
        "motd": {
          "type": "object",
          "$ref": "#/$defs/oneOfOptionsDef"
        }
      },
      "required": [
        "login",
        "motd"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "data"
  ],
  "$defs": {
    "messageDef": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2048
    },
    "oneOfOptionsDef": {
      "oneOf": [
        {
          ***"$ref": "https://example.com /schema/common/common_json_schema_defs.json#/defs/variableOptionTypeObjectDef"***
        },
        {
          "properties": {
            "optionType": {
              ***"$ref": "https://example.com /schema/common/common_json_schema_defs.json#/defs/globalOptionTypeDef"***
            },
            "message": {
              "$ref": "#/$defs/messageDef"
            }
          },
          "required": [
            "optionType",
            "message"
          ],
          "additionalProperties": false
        },
        {
          "properties": {
            "optionType": {
              ***"$ref": "https://example.com /schema/common/common_json_schema_defs.json#/defs/defaultOptionTypeDef"***
            },
            "message": {
              ***"$ref": "https://example.com /schema/common/common_json_schema_defs.json#/defs/emptyStringDef"***
            }
          },
          "required": [
            "optionType",
            "message"
          ],
          "additionalProperties": false
        }
      ]
    }
  },
  "additionalProperties": false
}

示例架构 2:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com /schema/common/common_json_schema_defs.json",
  "title": "Common Json Schema Definitions",
  "description": "Schema defining all the reusable common defs in other schemas",
  "type": "object",
  "defs": {
    "emptyStringDef": {
      "type": "string",
      "enum": [
        ""
      ]
    },
    "variableNameDef": {
      "type": "string",
      "pattern": "^\\{\\{[a-zA-Z0-9_-]+\\}\\}$",
      "minLength": 1,
      "maxLength": 32
    },
    "globalOptionTypeDef": {
      "enum": [
        "global"
      ]
    },
    "variableOptionTypeDef": {
      "enum": [
        "variable"
      ]
    },
    "defaultOptionTypeDef": {
      "enum": [
        "default"
      ]
    },
    "variableOptionTypeObjectDef": {
      "properties": {
        "optionType": {
          "$ref": "#/defs/variableOptionTypeDef"
        },
        "variableName": {
          "$ref": "#/defs/variableNameDef"
        }
      },
      "required": [
        "optionType",
        "variableName"
      ],
      "additionalProperties": false
    }
  }
}

验证期间的异常:

2021-08-12T15:53:02,413  [ERROR] [main] JsonSchemaFactory: Failed to load json schema!
java.io.FileNotFoundException: https://example.com /schema/common/common_json_schema_defs.json
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1920) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520) ~[?:?]
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250) ~[?:?]
    at com.networknt.schema.uri.URLFetcher.openConnectionCheckRedirects(URLFetcher.java:57) ~[json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.uri.URLFetcher.fetch(URLFetcher.java:43) ~[json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.uri.URISchemeFetcher.fetch(URISchemeFetcher.java:50) ~[json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchemaFactory.getSchema(JsonSchemaFactory.java:345) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.RefValidator.getRefSchema(RefValidator.java:79) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.OneOfValidator$ShortcutValidator.<init>(OneOfValidator.java:37) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.OneOfValidator.<init>(OneOfValidator.java:122) [json-schema-validator-1.0.57.jar:?]
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:?]
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:?]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:490) [?:?]
    at com.networknt.schema.ValidatorTypeCode.newValidator(ValidatorTypeCode.java:131) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonMetaSchema.newValidator(JsonMetaSchema.java:388) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.ValidationContext.newValidator(ValidationContext.java:57) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchema.read(JsonSchema.java:223) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchema.getValidators(JsonSchema.java:412) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:245) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchemaRef.validate(JsonSchemaRef.java:38) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.RefValidator.validate(RefValidator.java:133) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) [json-schema-validator-1.0.57.jar:?]
    at com.networknt.schema.BaseJsonValidator.validate(BaseJsonValidator.java:104) [json-schema-validator-1.0.57.jar:?]

【问题讨论】:

    标签: json jsonschema json-schema-validator


    【解决方案1】:

    如果您在 $refs 中使用的 URI 上的架构文件不是网络可寻址的,那么评估者需要知道如何找到您的文件。您应该查阅您正在使用的工具的文档以了解如何预加载这些文档,以便它可以使用它们来解析这些 $refs。

    【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2012-09-22
    • 2016-01-30
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多