我有一个 JSON,它可以有一个 IBAN
帐号,在这种情况下需要一个 BIC
,或者一个 account_number
或两者都有
因此,这是有效的(仅 account_number
):
"bankaccount_data": [
{
"bic": null,
"iban": null,
"account_name": "Bankgiro",
"account_number": "12345-6789",
"bank_name": "Bankgiro",
"type": "Bankgiro"
}
]
这对 iban
和 bic
有效:
"bankaccount_data": [
{
"bic": "BANKBIC",
"iban": "SE0123456789",
"account_name": "Bankgiro",
"account_number": null,
"bank_name": "Bankgiro",
"type": "Bankgiro"
}
]
即使是 account_number
和 iban/bic
:
"bankaccount_data": [
{
"bic": "BANKBIC",
"iban": "SE0123456789",
"account_name": "Bankgiro",
"account_number": "12345-6789",
"bank_name": "Bankgiro",
"type": "Bankgiro"
}
]
我的问题是同时需要 iban
和 bic
(如果存在的话)。我有这个模式,它没有这样做,但应该“说明”我的需要:
"bankaccount_data": {
"type": "array",
"items": [
{
"type": "object",
"properties": {
"account_name": { "type": "string" },
"bank_name": { "type": [ "string", "null" ] },
"type": { "type": "string" }
},
"required": [ "type" ],
"anyOf": [
{
"type": "object",
"properties": {
"bic": { "type": "string" },
"iban": { "type": "string" }
},
"required": [ "bic", "iban" ],
"dependencies": {
"iban": [
"bic"
],
"bic": [
"iban"
]
}
},
{
"type": "object",
"properties": {
"account_number": { "type": "string" }
},
"required": [ "account_number" ]
}
]
}
]
}
最佳答案
我不太确定,但我想你是在问,如果存在 iban
或 bic
,那么另一个也必须存在。
您的想法很正确。然而,您的值可以为空而不是根本不存在这一事实使情况变得复杂。
dependencies
只检查属性是否存在,与它们的值无关。 null
仍然是一个值。 dependencies
在您的情况下无法帮助您,因为您总是希望对象中存在键。
首先让我们看看解决方案。
{
"anyOf": [
{
"properties": {
"bic": { "type": "string" },
"iban": { "type": "string" },
"account_number": { "enum": [null]}
},
"required": [
"iban",
"bic"
]
},
{
"required": [
"account_number"
],
"properties": {
"bic": { "enum": [null] },
"iban": { "enum": [null] },
"account_number": { "type": "string" }
}
}
]
}
https://jsonschema.dev/s/dg0CY
您需要这种重复的原因是您需要完整地表达您检查的条件。
anyOf
数组的值是子模式。这些值本身就是完整的模式。
为 anyOf
取值,anyOf[0]
确实表达了您正在寻找的约束,但是 anyOf[1]
什么也没说关于 iban
或 bic
,因此“任何”模式都被认为是有效的。 anyOf
中的每个值都不知道彼此的内容;仅合并结果。
JSON Schema 是基于约束的,因此任何未表达的内容都是允许的。
在我上面提供的解决方案中,anyOf
中的每个模式都会完全检查所需的条件。
对于您的示例,它在 draft-07 中的工作方式与 draft-04 相同,因此演示是相同的。
关于jsonschema - JSON Schema (v04) anyOf 与依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62059542/