我正在尝试定义一个有效的JSON模式,但我不知道当被引用的组件在子目录中时,如何构造引用("$ref"(值。我已经(详细地(阅读了官方JSON Schema网站上的信息,以及来自各种JSON Schema解析器的测试数据,但可用的信息要么不清楚,要么不可用(当然,尽管搜索了几个小时,我还是找不到(。。。
我需要的特定帮助是确认是否应该用";部件";是否在引用中。(请注意,$id不可用于提供基本URI(。
换言之,";message.schema.json";be:
- 选项1:";components/key.schema.json";以及";components/data.schema.json";,或者
- 选项2:";key.schema.json";以及";data.schema.json";(如下所示(
在选项1中$ref";是相对于父路径("main.schema.json"(,在选项2中是相对于当前路径("message.schema.json"(
以下是提供进一步背景的信息。
文件结构相对简单,如下所示:
main.schema.json
- message.schema.json
- key.schema.json
- data.schema.json
文件的内容如下所示。。。
main.schema.json:
{
"$id": "https://example.com/arrays.schema.json",
"description": "main.schema.json",
"type": "object",
"required": [ "messages" ],
"properties": {
"messages": {
"type": "array",
"items": { "$ref": "components/message.schema.json" }
}
}
}
上面的JSON模式引用了";部件";directory(main.schema.json文件下的一个目录(。
message.schema.json:
{
"$id": "https://example.com/arrays.schema.json",
"description": "message.schema.json",
"type": "object",
"required": [ "message" ],
"properties": {
"message": {
"type": "object",
"required": [ "key", "data" ],
"properties": {
"key": {
"$ref": "key.schema.json"
},
"data": {
"$ref": "data.schema.json"
}
}
}
}
}
上面的message.schema.json引用了与message.schema.json文件位于相同目录中的以下组件:
key.schema.json:
{
"$id": "https://example.com/arrays.schema.json",
"description": "key.schema.json",
"type": "object",
"required": [ "key" ],
"properties": {
"key": {
"type": "string"
}
}
}
data.schema.json:
{
"$id": "https://example.com/arrays.schema.json",
"description": "data.schema.json",
"type": "object",
"required": [ "data" ],
"properties": {
"data": {
"type": "object",
"required": [ "veggieName", "veggieLike" ],
"properties": {
"veggieName": {
"type": "string",
"description": "The name of the vegetable."
},
"veggieLike": {
"type": "boolean",
"description": "Do I like this vegetable?"
}
}
}
}
}
为什么所有架构都有相同的$id
?许多实现将在这一点上出错;忘记";当您加载具有相同标识符的稍后模式时,可以了解早期模式。
我不确定你是否认为这里使用了description
关键字,但事实并非如此。重要的关键字是$id
,它的值被用作未来URI解析的基础,例如$ref
中的URI解析。
根据您使用的具体实现,您需要确保$id
关键字中的URI是可正确解析的(也就是说,如果您转到URL";https://example.com/message.schema.json"它实际上会下载一些东西(,或者在开始评估之前需要手动将所有文件加载到实现中。规范不要求实现支持网络解析,但要求实现支持某种机制,以便在其规范标识符下预加载模式。
如果使用这些值作为$id
s(用更合适的主机替换example.com(:
- https://example.com/main.schema.json
- https://example.com/components/message.schema.json
- https://example.com/components/key.schema.json
- https://example.com/components/data.schema.json
。。然后从main到其他文件的所有引用都可以通过uri引用进行:
- 从主文件到其他文件:
"$ref": "components/key.schema.json"
等 - 从其他文件到彼此:
"$ref": "key.schema.json"
等 - 从其他文件返回到主文件:
"$ref": "../main.schema.json"
当然,您也可以在所有$ref
s中使用完整的绝对URI。