如何在python-jsonschema文档中设置本地文件引用? [英] How to set up local file references in python-jsonschema document?
问题描述
我有一组 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机器上可能很重要.
(我将其写为Q& A是因为我很难弄清楚这一点,并且也有麻烦.)
您必须为每个使用相对引用的模式构建自定义jsonschema.RefResolver
,并确保您的解析器知道给定模式在文件系统上的位置.>
例如...
import os
import json
from jsonschema import Draft4Validator, RefResolver # We prefer Draft7, but jsonschema 3.0 is still in alpha as of this writing
abs_path_to_schema = '/path/to/schema-doc-foobar.json'
with open(abs_path_to_schema, 'r') as fp:
schema = json.load(fp)
resolver = RefResolver(
# The key part is here where we build a custom RefResolver
# and tell it where *this* schema lives in the filesystem
# Note that `file:` is for unix systems
schema_path='file:{}'.format(abs_path_to_schema),
schema=schema
)
Draft4Validator.check_schema(schema) # Unnecessary but a good idea
validator = Draft4Validator(schema, resolver=resolver, format_checker=None)
# Then you can...
data_to_validate = `{...}`
validator.validate(data_to_validate)
I have a set of jsonschema compliant documents. Some documents contain references to other documents (via the $ref
attribute). I do not wish to host these documents such that they are accessible at an HTTP URI. As such, all references are relative. All documents live in a local folder structure.
How can I make python-jsonschema
understand to properly use my local file system to load referenced documents?
For instance, if I have a document with filename defs.json
containing some definitions. And I try to load a different document which references it, like:
{
"allOf": [
{"$ref":"defs.json#/definitions/basic_event"},
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["page_load"]
}
},
"required": ["action"]
}
]
}
I get an error RefResolutionError: <urlopen error [Errno 2] No such file or directory: '/defs.json'>
It may be important that I'm on a linux box.
(I'm writing this as a Q&A because I had a hard time figuring this out and observed other folks having trouble too.)
You must build a custom jsonschema.RefResolver
for each schema which uses a relative reference and ensure that your resolver knows where on the filesystem the given schema lives.
Such as...
import os
import json
from jsonschema import Draft4Validator, RefResolver # We prefer Draft7, but jsonschema 3.0 is still in alpha as of this writing
abs_path_to_schema = '/path/to/schema-doc-foobar.json'
with open(abs_path_to_schema, 'r') as fp:
schema = json.load(fp)
resolver = RefResolver(
# The key part is here where we build a custom RefResolver
# and tell it where *this* schema lives in the filesystem
# Note that `file:` is for unix systems
schema_path='file:{}'.format(abs_path_to_schema),
schema=schema
)
Draft4Validator.check_schema(schema) # Unnecessary but a good idea
validator = Draft4Validator(schema, resolver=resolver, format_checker=None)
# Then you can...
data_to_validate = `{...}`
validator.validate(data_to_validate)
这篇关于如何在python-jsonschema文档中设置本地文件引用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!