Модель Swagger для массива с именованными элементами

Написание модели swagger для массива json кажется мне довольно простым, например. если бы у меня был этот массив:

[
  {
    "name": "dave",
    "number": 123
  },
  {
    "name": "mary",
    "number": 456
  }
]

Я бы написал для него следующую модель чванства:

"schema": {
  "type": "array",
  "items": {
    "$ref": "Student"
  }
}

"Student": {
  "id": "Student",
  "required": [
    "name",
    "number"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "number": {
      "type": "integer",
      "format": "int32"
    }
  }
}

Однако у меня есть следующее:

{
  "123": {
    "name": "dave"
  },
  "456": {
    "name": "mary"
  }
}

Как написать модель для этого?

Заранее спасибо.


person DeZot    schedule 09.01.2015    source источник
comment
Это не массив, это объект с картой внутри. Это то, что вы хотите описать, или в образце ошибка? Кроме того, какую версию Swagger вы используете?   -  person Ron    schedule 09.01.2015
comment
Вы правы, это действительно не массив. Нет никакой ошибки, это именно тот json, который я хочу описать, но я не уверен, как это сделать. Я использую swagger 2.0 (хотя я признаю, что в том, что я написал, есть остатки 1.2).   -  person DeZot    schedule 09.01.2015
comment
Если вы не хотите печатать вручную, вы можете попробовать конвертер определений JSON в Swagger: roger13.github.io/ SwagDefGen   -  person Roger    schedule 02.02.2017


Ответы (1)


Для описания модели запроса необходимо использовать свойства additionalProperties. Имейте в виду, что это доступно в Swagger 2.0 и недоступно в более ранних версиях.

"definitions": {
    "Student": {
        "type": "object",
        "required": [ "name" ],
        "properties": {
            "name": {
                "type": "string"
            }
        }
    },
    "Students": {
        "type": "object",
        "additionalProperties": {
            "$ref": "#/definitions/Student"
        }
    }
}

Выше вы видите модель Student, которая в настоящее время содержит свойство «имя», хотя я предполагаю, что вы добавите к нему больше. В приведенном выше примере требуется свойство «имя».

Вторая модель — Students, которая представляет собой объект, содержащий карту (дополнительные свойства). Каждое свойство относится к типу Student (делается путем ссылки на модель, но теоретически может быть определено встроенно).

Единственное, что вы не можете сделать, это объявить, что ключ (или имя свойства) является целым числом или имеет заданный тип. Это могло быть поддержано с помощью patternedProperties, которого нет в Swagger 2.0. Другими словами, нет технического способа ограничить содержимое ключа.

person Ron    schedule 09.01.2015
comment
Спасибо за это. Однако мне кажется, что swagger-ui еще не поддерживает его, поскольку, когда я попробовал, все, что я увидел, было пустым объектом. Средство предварительного просмотра swagger-editor также показывает мне пустой объект, хотя и не сообщает об ошибках. - person DeZot; 12.01.2015
comment
Правда, я считаю, что пользовательский интерфейс в настоящее время не поддерживает «дополнительные свойства». Не стесняйтесь открывать вопрос об этом. - person Ron; 12.01.2015