"#/allOf/1/properties/body/properties/foo"
是否有效$ ref?
正如所述in this article解释$ ref使用情况,看起来应该如此
但是,AJV和https://www.jsonschemavalidator.net/似乎都不同意。
使用普通的JSON指针尝试它似乎是可能的:https://repl.it/repls/WretchedSpiritedMammoth
这是我正在测试的架构。
{
"$schema": "http://json-schema.org/draft-06/schema#",
"type": "object",
"allOf": [
{
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http:/example.org/example.schema.json",
"type": "object",
"properties": {
"type": {
"type": "string"
},
"body": {
"type": "object"
}
},
"required": [
"type",
"body"
]
},
{
"properties": {
"body": {
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://example.org/foo.schema.json",
"type": "object",
"properties": {
"foo": {
"type": "number",
"minimum": 1
},
"bar": {
"$ref": "#/allOf/1/properties/body/properties/foo"
}
},
"required": [
"foo",
"bar"
]
}
}
}
]
}
编辑:这些是我得到的错误:
jsonschemavalidator.net
解析架构时出错 消息:解析模式引用
'#/allOf/1/properties/body/properties/foo'
时出错。 路径'allOf[1].properties.body.properties.bar'
,行..,位置..
AJV :
无法解析来自身份http://example.org/foo.schema.json“
的参考#/allOf/1/properties/body/properties/foo
答案 0 :(得分:1)
虽然您已在子模式中设置了$id
,但您的架构大多是正确的。
“$ id”关键字定义架构的URI,以及基本URI 模式中的其他URI引用将被解析。
https://tools.ietf.org/html/draft-handrews-json-schema-00#section-9.2
通过向子模式添加$id
,您可以重置其他URI引用的基URI,包括在子模式及其子项中使用$ref
。
$ref
...针对当前的URI基础,它标识了一个的URI 要使用的架构。
https://tools.ietf.org/html/draft-handrews-json-schema-00#section-8
通过将bar的定义更改为以下内容,您的架构将有效。
"bar": {
"$ref": "#/properties/foo"
}
在后来的评论中进一步编辑为Relequestual:
将绝对URI作为subschema $ id是有效的,但如上所述,它会重置基URI。对$ id值的限制仅在使用它来创建本地URI片段标识符时适用(如果这对您没有任何意义,请不要担心)。
直接从另一个属性架构引用属性架构是有效的,但更常见的最佳做法是将此类架构放在“definitions”关键字下,并让两个属性都引用该位置。这是我建议的最大限度的清晰度:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"type": "object",
"allOf": [
{
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http:/example.org/example.schema.json",
"type": "object",
"properties": {
"type": {
"type": "string"
},
"body": {
"type": "object"
}
},
"required": [
"type",
"body"
]
},
{
"properties": {
"body": {
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://example.org/foo.schema.json",
"type": "object",
"properties": {
"foo": {
"$ref": "#/definitions/whateverYouWantToCallIt"
},
"bar": {
"$ref": "#/definitions/whateverYouWantToCallIt"
}
},
"required": [
"foo",
"bar"
]
}
},
"definitions": {
"whateverYouWantToCallIt": {
"type": "number",
"minimum": 1
}
}
}
]
}