【发布时间】: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