JSON架构相对引用解析



我正在尝试定义一个有效的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"它实际上会下载一些东西(,或者在开始评估之前需要手动将所有文件加载到实现中。规范不要求实现支持网络解析,但要求实现支持某种机制,以便在其规范标识符下预加载模式。

如果使用这些值作为$ids(用更合适的主机替换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"

当然,您也可以在所有$refs中使用完整的绝对URI。

相关内容

  • 没有找到相关文章

最新更新