jsonschema - JSON Schema (v04) anyOf 与依赖关系

标签 jsonschema

我有一个 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"
    }
]

这对 ibanbic 有效:

"bankaccount_data": [
    {
        "bic": "BANKBIC",
        "iban": "SE0123456789",
        "account_name": "Bankgiro",
        "account_number": null,
        "bank_name": "Bankgiro",
        "type": "Bankgiro"
    }
]

即使是 account_numberiban/bic:

"bankaccount_data": [
    {
        "bic": "BANKBIC",
        "iban": "SE0123456789",
        "account_name": "Bankgiro",
        "account_number": "12345-6789",
        "bank_name": "Bankgiro",
        "type": "Bankgiro"
    }
]

我的问题是同时需要 ibanbic(如果存在的话)。我有这个模式,它没有这样做,但应该“说明”我的需要:

"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" ]
        }
      ]
    }
  ]
}

最佳答案

我不太确定,但我想你是在问,如果存在 ibanbic,那么另一个也必须存在。

您的想法很正确。然而,您的值可以为空而不是根本不存在这一事实使情况变得复杂。

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] 什么也没说关于 ibanbic,因此“任何”模式都被认为是有效的。 anyOf 中的每个值都不知道彼此的内容;仅合并结果。

JSON Schema 是基于约束的,因此任何未表达的内容都是允许的。

在我上面提供的解决方案中,anyOf 中的每个模式都会完全检查所需的条件。

对于您的示例,它在 draft-07 中的工作方式与 draft-04 相同,因此演示是相同的。

关于jsonschema - JSON Schema (v04) anyOf 与依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62059542/

相关文章:

Json 架构相对于当前 "id"的 $ref

java - Jackson JsonSchemaGenerator - 如何将模式获取为字符串

json - 关于自定义json schema的一些问题

键具有不同名称的 JSON 模式

javascript - 如何使用 json 模式文件测试 json 文件

JavaScript:用于验证另一个 JSON 模式的 JSON 模式

javascript - 如何在 AJV 错误的错误消息中使用属性名称

postman - 使用 postman 和 tv4 针对具有多个元素的 json 数组验证 jsonschema

java - 打开Api $ref以使用url

java - 使用 java - ref 的 JSON 模式验证