JSON 架构 (v04) 任何具有依赖项
JSON Schema (v04) anyOf with dependencies
我有一个 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"
}
]
我的问题是如果 either/or 存在,则同时需要 iban
和 bic
。我有这个模式,它没有这样做,但应该 "illustrate" 我的需要:
"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
,因此 "any of" 模式被认为是有效的。 anyOf
中的每个值都不知道彼此的内容;仅合并结果。
JSON 架构是基于约束的,所以任何未表达的内容都是允许的。
在我上面提供的解决方案中,anyOf
中的每个模式都完全检查所需的条件。
对于您的示例,它在 draft-07 中的工作原理与 draft-04 相同,因此演示相同。
我有一个 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"
}
]
我的问题是如果 either/or 存在,则同时需要 iban
和 bic
。我有这个模式,它没有这样做,但应该 "illustrate" 我的需要:
"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
,因此 "any of" 模式被认为是有效的。 anyOf
中的每个值都不知道彼此的内容;仅合并结果。
JSON 架构是基于约束的,所以任何未表达的内容都是允许的。
在我上面提供的解决方案中,anyOf
中的每个模式都完全检查所需的条件。
对于您的示例,它在 draft-07 中的工作原理与 draft-04 相同,因此演示相同。