【问题标题】:validate one of the Array object in json schema conditionally有条件地验证 json 模式中的 Array 对象之一
【发布时间】:2021-12-07 07:44:29
【问题描述】:

只有当 typemobileendDate 为空/null 时,下面的 json 才有效,否则验证需要失败。这里 type 可以有任何值,但我的验证仅在 mobile 类型上。

有效的 json:

{
  "contacts": [
   {
    "type": "mobile",
    "endDate": "",
    "number": "1122334455"
   },
   {
    "type": "home",
    "endDate": "",
    "number": "1111122222"
   },
   {
    "type": "mobile",
    "endDate": "12-Jan-2017",
    "number": "1234567890"
   },
  ]
}

无效的 json:(因为联系人没有有效的手机号码)

{
  "contacts": [
   {
    "type": "mobile",
    "endDate": "12-Jan-2021",
    "number": "1122334455"
   },
   {
    "type": "home",
    "endDate": "",
    "number": "1111122222"
   },
   {
    "type": "mobile",
    "endDate": "12-Jan-2017",
    "number": "1234567890"
   },
  ]
}

我尝试过的架构

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "type": "object",
  "properties": {
    "contacts": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "number": {
            "type": "string"
          }
        },
        "anyOf": [
          {
            "if": {
              "properties": {
                "type": {
                  "const": "mobile"
                }
              }
            },
            "then": {
              "properties": {
                "endDate": {
                  "maxLength": 0
                }
              }
            }
          }
        ]
      }
    }
  }
}

任何人都可以为我提供上述 json 的正确模式,并附上示例代码 here,这是有效的 json,但出现错误。无效的 json 示例是 here 为什么因为移动类型没有空的 endDate。 提前致谢。

【问题讨论】:

  • 你能告诉我你目前拥有的 JSON Schema 吗?当我看不到您的架构时,我很难提出解决方案,因为它可能不适合。
  • @Relequestual :我已经添加了我尝试过的内容,但没有达到我的预期。
  • Mods:这个问题应该被关闭,因为这个问题是一个错字,不太可能帮助其他人。我不能出于其他原因撤回我的投票以关闭并重新投票。
  • 不,一点也不。您应该尽可能提供一个最小的、可重现的示例:stackoverflow.com/help/minimal-reproducible-example - 在修复您的复制粘贴错误时,我无法复制该问题。这是一个带有我建议的“解决方案”(修正错字)的工作演示:jsonschema.dev/s/LA432 - 如果您仍有问题,请告诉我它们是什么。
  • 示例代码有错字,我们应该关闭问题,因为它不会帮助其他人。关闭问题时有一个特定的类别。

标签: json jsonschema json-schema-validator


【解决方案1】:

我找到了答案,我们不需要使用anyOfoneOf。右边是 containscontains 的位置也是一个母校。工作示例是here

这是正确的架构

{
  "type": "object",
  "properties": {
    "contacts": {
      "type": "array",
      "minItems": 1,
      "contains": {
        "type": "object",
        "properties": {
          "type": {
            "const": "mobile"
          },
          "endDate": {
            "type" : ["string", "null"],
            "maxLength": 0
          }
        },
        "required": ["type"]
      },
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "number": {
            "type": "string"
          }
        }
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    您的架构定义了properties > data,但您的实例数据使用contacts 而不是data。更改任何一个都可以解决您的问题。否则,您已正确执行此操作。

    (如果您只有一个 type 要检查,则无需将 if/then 架构包装在 anyOf 中。)

    【讨论】:

    • 问题被修改,我用了anyOfoneOf 运气不好,请提供解决方案。
    • 请参阅工作示例jsonschema.dev/s/LA432 - 如果您对不同的架构有进一步的问题,请创建一个新问题,而不是使用不同的架构修改这个问题。如工作示例所示,此解决方案可以满足您的要求。
    • jsonschema.dev/s/GGIgL 验证成功,预计此jsonschema.dev/s/3UMQ4 也会成功
    • 为什么你认为第二个有效?您的要求是“至少有一个联系人必须是手机但没有过期”还是“如果其中一个联系人是手机,至少有一个手机必须没有过期”?
    • 至少有一个手机联系人必须没有过期。是我的要求。
    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多