Swagger Codegen десериализовать динамический c ответ - PullRequest
1 голос
/ 16 апреля 2020

Из моего Java бэкэнда я использую другой бэкэнд, которым я не управляю, и его определение API недоступно. Я создаю определение OpenAPI его сервисов и использую Swagger Codegen для генерации клиента.

Существует конечная точка, которая возвращает сложный объект:

{
    "total": 151,
    "version": 4,
    "dynamicItem1": [
        "codeDynamicItem1",
        293,
        63700,
        19,
        "nameDynamicItem1",
        "",
        "",
        "",
        0,
        -64
    ],
    "dynamicItem2": [
        "codeDynamicItem2",
        237,
        40000,
        478,
        "nameDynamicItem2",
        "string1",
        "string2",
        "string3",
        0,
        0
    ]

}

В этом объекте total и version всегда есть, но на одном уровне есть сотни этих динамических c предметов. Ключ предсказуем в приведенном выше примере, но на самом деле это последовательность букв и цифр, что-то вроде «245df921». Динамические c элементы - это всегда массивы с одинаковым количеством элементов и с одинаковыми ожидаемыми позициями.

Для анализа этого объекта я использую AdditionalProperties , потому что я прочитал, что это правильно способ разбора хеш-карт, но кажется, что я не применяю его правильно.

В настоящее время мое представление OpenAPI выглядит следующим образом:

openapi: 3.0.2
info:
  version: 1.0.0
  title: title
  description: description
paths:
  /complexObject:
    get:
      responses:
        '200':
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
components:
  schemas:
    Object:
      type: object
      properties:
        total:
          type: number
          example: 151
        version:
          type: number
          example: 4
        additionalProperties:
          type: array
          items:
            type: string
            nullable: true

При использовании этой реализации total и version возвращаются правильно, но в объекте ответа есть атрибут additionalProperties с нулевым значением.

Что мне не хватает?

1 Ответ

0 голосов
/ 17 апреля 2020

additionalProperties должен быть на том же уровне, что и properties.

Кроме того, так как эти массивы динамических c являются многотипными (строка / целое число), вам нужно oneOf, чтобы определить возможные типы элементов.

components:
  schemas:
    Object:
      type: object
      properties:
        total:
          type: number
          example: 151
        version:
          type: number
          example: 4
      additionalProperties:   # <-----
        type: array
        items:
          oneOf:              # <-----
            - type: string
              nullable: true
            - type: integer
...