引用路径的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设置它。这是否回答了您的问题?必须为要引用的每个架构创建自己的引用解析。如果你有很多,你可以在一个循环中这样做。