以下模式用于$id
提供一种与位置无关的方式来识别两个子模式:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "http://www.example.com/schema",
"$defs": {
"schema1": {
"$id": "insect",
"type": "string",
"enum": ["beetle", "grasshopper"]
},
"schema2": {
"$id": "fruit",
"type": "string",
"enum": ["orange", "apple"]
}
},
"$ref": "insect"
}
这个模式将实例限制在完全相同的程度,使用$anchor
:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "http://www.example.com/schema",
"$defs": {
"schema1": {
"$anchor": "insect",
"type": "string",
"enum": ["beetle", "grasshopper"]
},
"schema2": {
"$anchor": "fruit",
"type": "string",
"enum": ["orange", "apple"]
}
},
"$ref": "insect"
}
$id
那么和之间有什么区别$anchor
?
$anchor
是一个纯字符串,用于标识架构文档中的位置。它用在URI#
的片段 ( ) 部分$ref
。#/$defs/schema1
它是您通常在参考文献 ( == )中看到的 JSON 指针语法的替代方案#insect
。所以,你的第二个模式不正确。它缺少#
前面的“昆虫”$ref
。$id
情况要复杂得多。它是标识架构资源的 URI。该架构可以通过该 URI 引用。$id
也可以出现在模式中,如第一个示例中所示。在这种情况下, 所在的模式$id
被视为嵌入式模式。它被视为它自己的独立模式资源,与其嵌入的父模式分开。嵌入式模式的 URI可以根据父模式的URI$id
进行解析,以获得标识嵌入模式的完整 URI。$id
因此,模式的标识符"$id": "insect"
实际上是http://example.com/insect
。"$ref": "insect"
与该架构匹配,因为它也是根据该$id
架构解析的。通常,嵌入式模式仅用于捆绑单独开发的模式,但由于某种原因需要作为单个模式进行分发。因此,在编写模式时您不会使用它,但它可能会在构建步骤后出现。
由于
$id
标识模式并$anchor
标识模式中的位置,因此您有时可能会一起使用两者来引用您需要的内容。例如,您可以参考http://example.com/schema#insect
获取“昆虫”模式。http://example.com/schema
是由 定义的,$id
并且#insect
是由 定义的$anchor
。您可能会发现这些很有用。