14

I am looking to represent the following JSON Object in OpenAPI:

{
  "name": "Bob",
  "age": 4,
  ...
}

The number of properties and the property names are not fully predetermined, so I look to use additionalProperties. However, I'm not too certain how it would be represented through OpenAPI/Swagger 2.0. I tried this:

Person:
  type: object
  additionalProperties:
    type:
      - int
      - string

or the JSON equivalent:

{
  "Person": {
    "type": "object",
    "additionalProperties": {
      "type": ["int", "string"]
    }
  }
}

but that didn't quite work. Is there any way to keep the structure of the JSON Object I want to represent, for specifically strings and integers, and not arbitrary object types?

Helen
  • 87,344
  • 17
  • 243
  • 314
sle
  • 165
  • 1
  • 1
  • 8
  • @Helen It is not quite arbitrary; I know that it will be either a string or an int, but not booleans or nulls or other objects. – sle Sep 28 '17 at 17:49
  • Related: [Swagger-Editor model array with distinct types](https://stackoverflow.com/q/41904148/113116) – Helen Sep 28 '17 at 18:13

1 Answers1

29

OpenAPI 3.1

In OpenAPI 3.1, the type keyword can take a list of types:

Person:
  type: object
  additionalProperties:
    type: [string, integer]

OpenAPI 3.x

OpenAPI 3.0+ supports oneOf so you can use:

Person:
  type: object
  additionalProperties:
    oneOf:
      - type: string
      - type: integer

OpenAPI 2.0

OpenAPI 2.0 does not support multi-type values. The most you can do is use the typeless schema, which means the additional properties can be anything - strings, numbers, booleans, and so on - but you can't specify the exact types.

Person:
  type: object
  additionalProperties: {}

This is equivalent to:

Person:
  type: object
Helen
  • 87,344
  • 17
  • 243
  • 314