Схема JSON: XOR в обязательных полях

Схемы JSON имеют свойство required, в котором перечислены необходимые поля в объекте JSON. Например, следующая (упрощенная) схема проверяет вызов, который отправляет текстовое сообщение пользователю:

{
  "type": "object",
  "properties": {
    "userId":    { "type": "string" },
    "text":      { "type": "string" },
  },
  "required": ["userId", "text"]
}

Предположим, что я хочу включить отправку сообщения нескольким пользователям, т.е. иметь либо поле userId, либо массив userIds (но не оба или ни то, ни другое). Есть ли способ выразить такое условие в схеме JSON?

Естественно, в этом случае есть способы преодолеть проблему — например, массив userId с одним элементом — но общий случай интересен и полезен.


person Adam Matan    schedule 06.07.2016    source источник


Ответы (2)


Вы, вероятно, уже разобрались с этим, но это поможет использовать oneOf на type поля.

{
  "type": "object",
  "properties": {
    "userId": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "text": {
      "type": "string"
    }
  },
  "required": ["userId", "text"]
}
person Sam Sunde    schedule 13.04.2018

Совсем не элегантно, но я думаю, что вы можете вырезать это из allOf и oneOf. Что-то вроде:

 {
   "allOf" : [
      {
        "type" : "object",
        "properties" : {
          // base properties come here
        }
      },
      "oneOf" : [
        {
        "properties" : {
             "userIds" : {"type" : "array"}
          },
          "required" : ["userIds"]
        },
        {
          "properties" : {
             "userId" : {"type" : "number"}
          },
          "required" : ["userId"]
        }
      ]
   ]
}
person erosb    schedule 15.07.2016