在JSON模式中,当一个属性引用另一个已定义的模式时,为了保留被引用定义的类型,是否最好将被引用的定义 Package 在“allOf”中,并在被引用定义之外的该定义中指示属性类型?或者在引用的定义中指明属性类型而不使用“allOf”是否更好?
例如,在下面的第一个模式中,mainObject和objectA的属性引用都 Package 在“allOf”和“type”中:在mainObject和objectA属性中使用“object”。而在模式版本2中,“mainObject”和“objectAInfo”定义指示“object”的“类型”。
从我在测试中看到的情况来看,这两个版本都实现了相同的验证目标,所以我想知道是否有特别的理由使用模式版本1而不是模式版本2?
架构版本1:
{
"info": {
"title": "mainObject",
"version": "0.0.1",
"baseUri": "",
"description": "An example object schema"
},
"properties": {
"mainObject": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/mainObject"
}
]
}
},
"required": [],
"definitions": {
"mainObject": {
"additionalProperties": false,
"description": "The financials entity root.",
"required": [],
"properties": {
"objectA": {
"type": "object",
"description": "Information on the liability accrued by the taxpayer",
"allOf": [
{
"$ref": "#/definitions/objectAInfo"
}
]
}
}
},
"objectAInfo": {
"additionalProperties": false,
"required": [],
"properties": {
"total1": {
"type": "number",
"description": "Overall liability accrued during the tax period. This number does not go down as the taxpayer pays off their liability. That is reflected in the periodBalance."
},
"total2": {
"type": "number",
"description": "Overall liability accrued during the tax period. This number does not go down as the taxpayer pays off their liability. That is reflected in the periodBalance."
}
}
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
"lang": "zxx",
"$id": "http://example.com/"
}
架构版本2:
{
"info": {
"title": "mainObject",
"version": "0.0.1",
"baseUri": "",
"description": "An example object schema"
},
"properties": {
"mainObject": {
"$ref": "#/definitions/mainObject"
}
},
"required": [],
"definitions": {
"mainObject": {
"type": "object",
"additionalProperties": false,
"description": "The financials entity root.",
"required": [],
"properties": {
"objectA": {
"$ref": "#/definitions/objectAInfo"
}
}
},
"objectAInfo": {
"type": "object",
"additionalProperties": false,
"required": [],
"properties": {
"total1": {
"type": "number",
"description": "Overall liability accrued during the tax period. This number does not go down as the taxpayer pays off their liability. That is reflected in the periodBalance."
},
"total2": {
"type": "number",
"description": "Overall liability accrued during the tax period. This number does not go down as the taxpayer pays off their liability. That is reflected in the periodBalance."
}
}
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
"lang": "zxx",
"$id": "http://example.com/"
}
要验证的文档示例:
{
"mainObject": {
"objectA": {
"total1": 0,
"total2": 1
}
}
}
1条答案
按热度按时间3j86kqsm1#
这取决于三件事:
1.你用的是哪种草稿?草案7和更早的版本 * 要求 *
$ref
是独立的,这意味着如果您有其他约束(例如,Schema 1中的type
),它们将被忽略。然而,在2019-09及以后的草案中,$ref
* 可以 * 有兄弟关键字(type
也将被验证)。1.多次引用。如果你有多个引用,你必须把它们放在
allOf
中单独的子模式中。否则你会有重复的$ref
键。1.可读性。即使对于现代模式,有些人仍然喜欢引用本身,以帮助他们隔离不同的需求集。这是个人意见。
简短回答:对于现代模式实现,这取决于您。只要确保声明您使用的
$schema
版本即可。