JSON 架构:如果未在属性中定义,则忽略必需的 属性

JSON Schema: Ignore required property if not defined in properties

如果 properties 定义中不存在 属性,有什么方法可以忽略它?

例如:

{
  "type": "object",
  "properties": {
    "billingAddress": {
      "type": "string"
    },
    "isSameAsBillingAddress": {
      "type": "boolean"
    }
    // Say I deleted the `mailingAddress` property
  },
  "required": [
    "billingAddress",
    "isSameAsBillingAddress",
    "mailingAddress" // ignore
  ]
}

据我了解,这似乎不可能。我知道这是一个愚蠢的问题,因为有人可能会说从 required 数组中删除 属性 名称,但是当我生成这个 JSON 模式时它变得有点复杂并且还想有条件地要求一个字段(如果存在)。

例如:

{
  "type": "object",
  "properties": {
    "billingAddress": {
      "type": "string"
    },
    "isSameAsBillingAddress": {
      "type": "boolean"
    }
    // Delete `mailingAddress` property
  },
  "required": [
    "billingAddress",
    "isSameAsBillingAddress"
  ],
  "oneOf": [
    {
      "properties": {
        "isSameAsBillingAddress": {
          "enum": [true]
        }
      }
    },
    {
      "properties": {
        "isSameAsBillingAddress": {
          "enum": [false]
        }
      },
      // Would like to ignore...
      "required": ["mailingAddress"]
    },
  ]
}

是的,如果 mailingAddress 属性 被删除,我可以写一些代码返回并清理这个模式,但我想知道是否有一些 JSON 模式方式智能地忽略未定义的 properties?

此外,从 JSON 模式生成器的角度来看,属性 名称似乎有太多地方可能潜伏,因此关于如何构建代码可以轻松清理的任何建议并生成连贯的 JSON 架构,我们也将不胜感激。

没有。 required 有意独立于 propertiesrequired 验证存在; properties 验证子架构 if 存在。

conditionally require a field if it exists

我对这可能意味着什么感到困惑 - 感觉倒退到 required 的地步。如果你只需要一个字段存在时存在,为什么要有 required

也许您只是想完全删除 required 个关键字?

这似乎更适合模式 linter -- 警告您 属性 定义丢失并且可能被意外删除。

您可以在此处找到 linter 列表 -- https://json-schema.org/implementations.html#schema-linter -- 如果此检查尚未实施,则可能相当容易。

所以我认为不应忽略不在属性中的必需 属性 名称。参见 https://datatracker.ietf.org/doc/html/draft-fge-json-schema-validation-00#section-5.4.3

在您的示例中,mailingAddress 必须存在并且其值可以是任何类型,因为 additionalProperties 默认为允许任何类型值的空对象。