JSONSchema - 元素可以单独出现或出现在一个组中

JSONSchema - Element can appear alone or within a group

我有一个 JSON 看起来像这样:

{
    "name": "Jane",
    "company_name": "BrandNewStartup",
    "designation": "DesignLead"
}

name 元素也可以单独出现在 JSON 中,所以下面的 JSON 也是有效的。

{
    "name": "Jane"
}

但是如果缺少namecompany_namedesignation就不会出现。所以下面的JSON应该是无效的:

{
    "company_name": "BrandNewStartup",
    "designation": "DesignLead"
}

我试过以下规则:

"oneOf": [
      {
          "required": [
              "name",
              "company_name",
              "designation"
           ]
      },
      {
           "required": [
              "name"
           ]
      }
]

但是这似乎不起作用(例如 this validation library 引发错误,即 JSON 应该只对一个模式有效,但对所有模式都有效).

如果我将其更改为 anyOf,第一个包含所有 3 个字段的 JSON 有效,但是当 name 单独出现时,会引发错误 company_name designation 字段丢失。

如何定义此规则?

JSON Schema 是一种基于约束的语言。允许您不指定的任何内容。

required 关键字表示对象中需要一个键,但不会固有地阻止包含任何其他键。

分解您问题中的架构,当您的对象中包含所有三个键时,如您的第一个示例实例,那么 oneOf 中的两个子架构都将有效。

为了限制允许的属性,您需要使用 additionalProperties 关键字,在您的情况下也意味着您需要使用 properties 关键字。 requiredadditionalProperties 没有影响。

第二个子模式只需要在实例只有 name 而没有其他键时才有效。这是使用以下修改后的 JSON 架构的现场演示:https://jsonschema.dev/s/7JcUa

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "oneOf": [
    {
      "required": [
        "name",
        "company_name",
        "designation"
      ]
    },
    {
      "required": [
        "name"
      ],
      "properties": {
        "name": true
      },
      "additionalProperties": false
    }
  ]
}