如何正确引用其他 JSON 模式文档 ($ref)
How to correctly reference other JSON Schema Documents ($ref)
我已经通读了关于 JSON 架构和 JSON 指针的 RFC,但我仍在努力理解如何正确引用其他文档。
假设我有以下文件(在磁盘上):
/foo/bar/schema/base.json
/foo/bar/schema/model/model.json
base.json像这样:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "/schema/base",
"title": "Base Response",
"description": "Schema descriptions of common properties of a response",
"type": [ "object" ],
"definitions": {
"data": {
"descrpition": "The response data is encapsulated within here",
"example": "true",
"type": [ "object", "array", "boolean", "null" ]
}
},
"properties": {
"data": { "$ref" : "#/definitions/data" }
}
}
model.json 文件是这样的:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "/schema/model/model",
"type": "object",
"$ref": "/schema/base.json"
}
model.json 中的 $ref 值就是我要问的。我对标准的理解是在文档的id和$ref之间,我们应该可以找到文档。
或者,我想知道是否有类似的东西:
"$ref": "../../base.json"
有用吗?
但这些解决方案似乎都无法使用我尝试过的 Python 或 PHP 库。我不确定哪里出错了?
首先,不同的库以不同的方式处理 $ref
分辨率,因此您需要按照它们的特定文档来了解确切的细节。但以下是有关 $ref
分辨率的一些一般信息,您可能会觉得有用。
将您的架构文档想象成您在浏览器中查看的网页。 id
代表浏览器 URL 栏中的 URL。它必须是完整的绝对标准化 URL,就像在您的浏览器中一样。
{
"id": "file:///path/to/project/foo/bar/schema/model/model.json"
}
将 $ref
想象成您在浏览器中查看的网页中的 link。 In 可以是绝对的或相对的,就像在您的浏览器中一样。相对 $ref
将遵循与网页上的 link 相同的规则进行解析。例如,我希望以下 JSON 中的所有 $ref
都解析为相同的值。 (注意:不能使用多个$ref
,仅供说明。)
{
"id": "file:///path/to/project/foo/bar/schema/model/model.json",
"$ref": "file:///path/to/project/foo/bar/schema/base.json",
"$ref": "/path/to/project/foo/bar/schema/base.json",
"$ref": "../model.json"
}
如果 id
不存在,用于检索架构的 URI 应假定为 id
。在这种情况下 file:///path/to/project/foo/bar/schema/model/model.json
.
从高层次来看,这就是它应该如何工作的方式,但实现方式因实现方式而异。有些要求以特定方式设置库。例如,我使用的 PHP 验证器要求您将所有模式注册到 SchemaStore
中,然后才能被引用。
参考:http://json-schema.org/latest/json-schema-core.html#anchor27
我已经通读了关于 JSON 架构和 JSON 指针的 RFC,但我仍在努力理解如何正确引用其他文档。
假设我有以下文件(在磁盘上):
/foo/bar/schema/base.json
/foo/bar/schema/model/model.json
base.json像这样:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "/schema/base",
"title": "Base Response",
"description": "Schema descriptions of common properties of a response",
"type": [ "object" ],
"definitions": {
"data": {
"descrpition": "The response data is encapsulated within here",
"example": "true",
"type": [ "object", "array", "boolean", "null" ]
}
},
"properties": {
"data": { "$ref" : "#/definitions/data" }
}
}
model.json 文件是这样的:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "/schema/model/model",
"type": "object",
"$ref": "/schema/base.json"
}
model.json 中的 $ref 值就是我要问的。我对标准的理解是在文档的id和$ref之间,我们应该可以找到文档。
或者,我想知道是否有类似的东西:
"$ref": "../../base.json"
有用吗?
但这些解决方案似乎都无法使用我尝试过的 Python 或 PHP 库。我不确定哪里出错了?
首先,不同的库以不同的方式处理 $ref
分辨率,因此您需要按照它们的特定文档来了解确切的细节。但以下是有关 $ref
分辨率的一些一般信息,您可能会觉得有用。
将您的架构文档想象成您在浏览器中查看的网页。 id
代表浏览器 URL 栏中的 URL。它必须是完整的绝对标准化 URL,就像在您的浏览器中一样。
{
"id": "file:///path/to/project/foo/bar/schema/model/model.json"
}
将 $ref
想象成您在浏览器中查看的网页中的 link。 In 可以是绝对的或相对的,就像在您的浏览器中一样。相对 $ref
将遵循与网页上的 link 相同的规则进行解析。例如,我希望以下 JSON 中的所有 $ref
都解析为相同的值。 (注意:不能使用多个$ref
,仅供说明。)
{
"id": "file:///path/to/project/foo/bar/schema/model/model.json",
"$ref": "file:///path/to/project/foo/bar/schema/base.json",
"$ref": "/path/to/project/foo/bar/schema/base.json",
"$ref": "../model.json"
}
如果 id
不存在,用于检索架构的 URI 应假定为 id
。在这种情况下 file:///path/to/project/foo/bar/schema/model/model.json
.
从高层次来看,这就是它应该如何工作的方式,但实现方式因实现方式而异。有些要求以特定方式设置库。例如,我使用的 PHP 验证器要求您将所有模式注册到 SchemaStore
中,然后才能被引用。
参考:http://json-schema.org/latest/json-schema-core.html#anchor27