【问题标题】:JSONSchema - Element can appear alone or within a groupJSONSchema - 元素可以单独出现,也可以在一个组中出现
【发布时间】:2021-04-27 14:32:37
【问题描述】:

我有一个如下所示的 JSON:

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

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

{
    "name": "Jane"
}

但是如果name 缺失,company_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 jsonschema json-schema-validator


    【解决方案1】:

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

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

    分解问题中的架构,当您在对象中拥有所有三个键时,就像在您的第一个示例实例中一样,那么 oneOf 中的两个子架构都是有效的。

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

    第二个子模式只需要在实例只有 name 而没有其他键时才有效。这是一个使用以下修改后的 JSON Schema 的现场演示: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
        }
      ]
    }
    

    【讨论】:

    • 我非常感谢这个详尽的解释。谢谢。
    • 不客气。随意使用我的简历中的链接给我买杯咖啡。没有期望=]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2019-05-05
    • 2015-10-25
    相关资源
    最近更新 更多