Как написать схему JSON для обеспечения условного существования других свойств?

Схема должна проверять следующие объекты json и не должна допускать каких-либо дополнительных свойств.

{
  "id": "11111111111111111111111111111111",
  "status": "employed",
  "company_name": "Google"
}

{
  "id": "00000000000000000000000000000000",
  "status": "unemployed"
}

Чертеж схемы v4:

{
  "type": "object",
  "additionalProperties":false,
  "required": [
    "status",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum":["unemployed", "employed"]
    },
    "company_name": {
      "type": "string"
    }
  },
  "dependencies": {
    "company_name": {
      "properties": {
        "status": {
          "enum": [
            "employed"
          ]
        }
      }
    }
  }
}

Эта схема выглядит правильно, но она не делает недействительным следующий объект json.

{
  "id": "00000000000000000000000000000001",
  "status": "employed"
}

Он должен быть недействительным, потому что "status" "занят", но обязательное свойство "company_name" не указано.

1 ответ

Это возможно, используя anyOf, но не уверен, как это сделать, используя зависимости.

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "status",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "unemployed",
        "employed"
      ]
    },
    "company_name": {
      "type": "string"
    }
  },
  "anyOf": [
    {
      "properties": {
        "status": {
          "enum": [
            "employed"
          ]
        }
      },
      "required": [
        "company_name"
      ]
    },
    {
      "properties": {
        "status": {
          "enum": [
            "unemployed"
          ]
        }
      },
      "not": {
        "required": [
          "company_name"
        ]
      }
    }
  ]
}

Благодаря esp.

Другие вопросы по тегам