0

如果定义中不存在所需的属性,有什么方法可以忽略它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 架构方式可以智能地忽略 undefined properties

同样从 JSON 模式生成器的角度来看,似乎有太多的地方可能隐藏了一个属性名称,因此任何关于如何在代码可以轻松清理和生成连贯 JSON 模式的地方构建它的建议也将不胜感激。

4

3 回答 3

2

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

你可以在这里找到一个 linter 列表——https://json-schema.org/implementations.html#schema-linter——如果这个检查还没有实现,那么这样做很容易。

于 2021-02-22T00:30:03.620 回答
1

不。required是有意独立于 的propertiesrequired验证存在;properties验证子模式(如果存在)。

如果存在,则有条件地要求一个字段

我对这可能意味着什么感到困惑——感觉倒退到了required. 如果您只需要一个字段在它存在时就存在,那为什么要存在required呢?

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

于 2021-02-20T01:56:19.070 回答
0

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

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

于 2021-02-28T07:51:40.470 回答