203

I have JSON schema file where one of the properties is defined as either string or null:

"type":["string", "null"]

When converted to YAML (for use with OpenAPI/Swagger), it becomes:

type:
  - 'null'
  - string

but the Swagger Editor shows an error:

Schema "type" key must be a string

What is the correct way to define a nullable property in OpenAPI?

1

1 Answer 1

358

This depends on the OpenAPI version.

OpenAPI 3.1+

Your example is valid in OpenAPI 3.1 and later versions, which are fully compatible with JSON Schema 2020-12.

type:
  - 'null'   # Note the quotes around 'null'
  - string

# same as
type: ['null', string]

The above is equivalent to:

oneOf:
  - type: 'null'   # Note the quotes around 'null'
  - type: string

The nullable keyword used in OAS 3.0.x (see below) does not exist in OAS 3.1+, it was removed in favor of the 'null' type.

OpenAPI 3.0.x

Nullable strings are defined as follows:

type: string
nullable: true

This is different from JSON Schema syntax because OpenAPI versions up to 3.0.x use their own flavor of JSON Schema ("extended subset"). One of the differences is that the type must be a single type and cannot be a list of types. Also there's no 'null' type; instead, the nullable keyword serves as a type modifier to allow null values.

OpenAPI 2.0

Version 2 does not support 'null' as the data type, so you are out of luck. You can only use type: string. But some tools support the vendor extension x-nullable: true to indicate nullable properties.

Consider migrating to OpenAPI v. 3 to get proper support for nulls.

Sign up to request clarification or add additional context in comments.

7 Comments

Would be nice to reference the 3.1 specification that this is stated. Reading on swagger.io/specification it explicitly says Multiple types via an array are not supported
Just to add for anyone coming to this later, for 3.0.3 specifically, nullable: true actually allows the type: 'nullable' value to be used. So you want to do nullable: true and type: 'null' together. spec.openapis.org/oas/v3.0.3#fixed-fields-19
@MichaelM there's no type: 'null' keyword in OpenAPI 3.0.x; instead you're supposed to use nullable: true as explained in this answer. The wording in the spec section you linked to is a bit confusing, but the intended meaning is that the value null is considered a valid value for a schema instance if this schema has the nullable: true attribute.
(cont.) type: 'null' and type: [....., 'null'] are valid only is OpenAPI 3.1.
@m.spyratos I could not find your quote by the link. Instead, the spec says that the schema object "is a superset of the JSON Schema Specification Draft 2020-12", which, if you follow the next link, brings you to a page with examples exactly like in this answer (datatracker.ietf.org/doc/html/draft-bhutton-json-schema-00).
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.