Swagger HashMap property type

jplaza picture jplaza · Apr 16, 2013 · Viewed 16.4k times · Source

Is there any way to define a HashMap or Generic Object type in the models section? I have a REST service that returns products and those products can have different options. The options property are basically a HashMap, where the id is the option name and its value is the option value.

Answer

Arnaud Lauret picture Arnaud Lauret · Apr 19, 2016

Yes it's possible.

In OpenAPI (fka. Swagger) 2.0 and 3.0, a hashmap is always a <string, something> map:

  • The key is always a string and do not need to be defined.
  • The value type is what you want and is defined with additionalProperties.

Let's say you want to describe a <string, string> hashmap like this one:

{
  "key1": "value1",
  "key2": "value2"
}

The corresponding OpenAPI 2.0 definition will be:

definitions:
  StringStringMap:
    type: object
    additionalProperties:
      type: string

In OpenAPI 3.0 the definition will be:

components:
  schemas:
    StringStringMap:
      type: object
      additionalProperties:
        type: string


A <string, object> hashmap like this

{
  "key1": {"someData": "data", "someOtherData": true},
  "key2": {"someData": "data2", "someOtherData": false}
}

will be defined this way in OpenAPI 2.0:

definitions:
  ComplexObject:
    type: object
    properties:
      someData:
        type: string
      someOtherData:
        type: boolean

  StringObjectMap:
    type: object
    additionalProperties:
      $ref: "#/definitions/ComplexObject"

and in OpenAPI 3.0:

components:
  schemas:
    ComplexObject:
      type: object
      properties:
        someData:
          type: string
        someOtherData:
          type: boolean

    StringObjectMap:
      type: object
      additionalProperties:
        $ref: "#/definitions/ComplexObject"

I've just covered this in depth in part 4 of my OpenAPI (fka Swagger tutorial).

The OpenAPI (fka. Swagger) specification explains briefly this too.