JSON 模式 "oneOf" 用于验证键的存在

JSON schema "oneOf" for validating existence of keys

我正在尝试创建一个 JSON 模式来验证多个不同的实体,这些实体具有大部分相同的属性,但只有少数属性不同。

{
  "firstname": "Bat",
  "lastname": "man",
  "email": "batman@gmail.com"
}

{
  "firstname": "Super",
  "lastname": "man",
  "phone": "543-453-4523"
}

{
  "firstname": "Wonderwo",
  "lastname": "man",
  "email": "wonderwoman@gmail.com"
}

基本上我想创建一个单一模式,确保姓氏是 "man" 并且具有 phoneemail 属性。

我尝试使用 oneOf 来实现它,如下所示:

{
  "properties": {
    "firstname": {
      "type": "string"
    },
    "lastname": {
      "type": "string",
      "pattern": "man"
    },
    "oneOf": [{
      "email": {
        "type": "string"
      },
      "phone": {
        "type": "string"
      }
    }]
  }
}

但我认为这行不通。使用 JSON 模式甚至可以实现这样的事情吗?我怎样才能做到这一点?

你有几个问题:

  1. "oneOf"是关键字,不能在属性里面使用。
  2. "oneOf"里面的项目应该是模式,你那里有的不是。
  3. "anyOf" 几乎总是比 "oneOf" 好,除非你真的需要独家 "OR"
  4. "pattern" 是一个错误的关键字,你需要 "enum" (或 draft-06 "const")

你需要:

{
  "type": "object",
  "required": ["firstname", "lastname"],
  "properties": {
    "firstname": {
      "type": "string"
    },
    "lastname": {
      "type": "string",
      "enum": ["man"]
    },
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    }
  },
  "anyOf": [
    { "required": ["email"] },
    { "required": ["phone"] }
  ]
}