有条件地验证 json 架构中的数组对象之一

validate one of the Array object in json schema conditionally

下面的 json 只有在 typemobileendDate[=33= 时才有效] 是 empty/null,否则验证需要失败。这里 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, this is valid json but getting error. Invalid json example is here 为什么因为类型 mobile 没有空的 endDate。 提前致谢。

您的架构定义 properties > data,但您的实例数据使用 contacts 而不是 data。更改其中任何一个都可以解决您的问题。您在其他方面做得正确。

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

我找到了一些答案,我们不需要使用 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"
          }
        }
      }
    }
  }
}