引用路径的python jsonschema的url类型未知
我有多个大的引用路径的python jsonschema的url类型未知,json,jsonschema,json-schema-validator,python-jsonschema,Json,Jsonschema,Json Schema Validator,Python Jsonschema,我有多个大的json模式文件。许多架构文件都有一些常见的属性 要删除公共模式定义之间的冗余,请在分离的模式文件中分离这些定义,并使用$ref引用单个JSON模式 我所有模式文件的目录结构如下 / |- schemas |- components |- page_layout.json |- page.json page.json的内容是 { "$schema": "http://json-schema.org/draft-07/schema#", "type":
json模式文件。许多架构文件都有一些常见的属性
要删除公共模式定义之间的冗余,请在分离的模式文件中分离这些定义,并使用$ref
引用单个JSON模式
我所有模式文件的目录结构如下
/
|- schemas
|- components
|- page_layout.json
|- page.json
page.json
的内容是
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"examples": [],
"items": {
"type": "object",
"required": [],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"page_layout", "banner_images"
]
},
"data": {
"type": "object"
}
},
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "page_layout"
}
}
},
"then": {
"properties": {
"data": {
"$ref": "components/page_layout.json"
}
}
}
}
]
}
}
并且page_layout.json
文件的内容是
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {},
"type": "object",
"required": [],
"additionalProperties": false,
"properties": {
"backgroundColor": {
"type": "string"
},
"templateName": {
"type": "string",
"enum": ["linear", "square", "circle"]
}
}
}
结合这两个文件,要验证的示例JSON数据如下
[
{
"type": "page_layout"
"data": {
"backgroundColor": "#ff00ff",
"templateName": "square"
}
},
{
"type": "banner_images"
"data": {
// Content for banner_images
}
}
]
数据的内容
将根据类型
值而变化
我使用验证JSON数据,验证代码是
import json
import jsonschema
import os
from json import JSONDecodeError
class SchemaValidator:
def __init__(self, category: str):
self.category = category
self.data = ''
def _schema(self):
schema_file = self.category.replace(' ', '_')
schema_path = os.path.join(os.path.dirname(__file__), 'json_schema', 'categories', '{}.json'.format(schema_file))
try:
with open(schema_path, 'r') as file:
return json.loads(file.read())
except FileNotFoundError:
raise Exception('Schema definition missing')
except JSONDecodeError:
raise Exception('Schema definition invalid')
def validate(self, data):
self.data = data
try:
status = jsonschema.validate(json.loads(data), self._schema())
except jsonschema.SchemaError as e:
raise Exception(e)
return status
但是这会给$ref
文件带来错误
unknown url type: 'components/page_layout.json'
默认情况下,JSON模式不知道物理文件或文件系统的任何符号。相反,它使用URI解析规则来确定正确的模式。一旦一个模式被加载,它所拥有的相对引用的唯一概念就是基于它的基本URI,您可以使用$id设置它。这是否回答了您的问题?必须为要引用的每个架构创建自己的引用解析。如果你有很多,你可以在一个循环中这样做。