我有一组符合 jsonschema 的文档。一些文档包含对其他文档的引用(通过 $ref
属性)。我不希望托管这些文档,以便可以通过 HTTP URI 访问它们。因此,所有引用都是相对的。所有文档都位于本地文件夹结构中。
我怎样才能让 python-jsonschema
理解正确使用我的本地文件系统来加载引用的文档?
例如,如果我有一个文件名为 defs.json
的文档包含一些定义。我尝试加载引用它的不同文档,例如:
{
"allOf": [
{"$ref":"defs.json#/definitions/basic_event"},
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["page_load"]
}
},
"required": ["action"]
}
]
}
我收到一个错误 RefResolutionError: <urlopen error [Errno 2] No such file or directory: '/defs.json'>
我在Linux机器上可能很重要。
(我将其写为问答,因为我很难弄清楚这一点并且 observed other folks having trouble too 。)
我最难弄清楚如何解决一组彼此
$ref
的模式(我是 JSON 模式的新手)。事实证明,关键是使用RefResolver
创建store
,dict
是从 url 映射到模式的 ```import json
from jsonschema import RefResolver, Draft7Validator
base = """
{
"$id": "base.schema.json",
"type": "object",
"properties": {
"prop": {
"type": "string"
}
},
"required": ["prop"]
}
"""
extend = """
{
"$id": "extend.schema.json",
"allOf": [
{"$ref": "base.schema.json#"},
{
"properties": {
"extra": {
"type": "boolean"
}
},
"required": ["extra"]
}
]
}
"""
extend_extend = """
{
"$id": "extend_extend.schema.json",
"allOf": [
{"$ref": "extend.schema.json#"},
{
"properties": {
"extra2": {
"type": "boolean"
}
},
"required": ["extra2"]
}
]
}
"""
data = """
{
"prop": "This is the property string",
"extra": true,
"extra2": false
}
"""
schema = json.loads(base)
extendedSchema = json.loads(extend)
extendedExtendSchema = json.loads(extend_extend)
schema_store = {
schema['$id'] : schema,
extendedSchema['$id'] : extendedSchema,
extendedExtendSchema['$id'] : extendedExtendSchema,
}
resolver = RefResolver.from_schema(schema, store=schema_store)
validator = Draft7Validator(extendedExtendSchema, resolver=resolver)
jsonData = json.loads(data)
validator.validate(jsonData)