Skip to main content

Overview

Build Status PyPI PyPI - Python Version

This is a straight Python port of the MIT-licensed mikunn/openapi-schema-to-json-schema (v2.1.0). This port is similarly MIT-licensed.

It converts from OpenAPI 3.0 to JSON Schema Draft 4.

Why?

OpenAPI 3 Schemas and JSON Schemas are mostly similar. However, JSON Schema validators are unaware of the differences between the two formats. This means that validating request/response JSON using a standard JSON Schema validator with OpenAPI 3 Schemas will result in incorrect validations in certain common cases.

One way to solve this problem is to translate the OpenAPI 3 schema to JSON Schema, which is the purpose of this library.

See here for more rationale, as well as Phil Sturgeon's blog post about the problem.

Features

  • converts OpenAPI 3.0 Schema Object to JSON Schema Draft 4
  • deletes nullable and adds "null" to type array if nullable is true and type is present
  • adds {"type": "null"} to oneOf or anyOf array if nullable is true and type is not present
  • supports deep structures with nested allOfs etc.
  • removes OpenAPI specific properties such as discriminator, deprecated etc. unless specified otherwise
  • optionally supports patternProperties with x-patternProperties in the Schema Object

NOTE: $refs are not dereferenced. You will need another library to read the spec and follow $ref fields.

Installation

$ pip install py-openapi-schema-to-json-schema

Usage

import json
from openapi_schema_to_json_schema import to_json_schema

openapi_schema = {
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "nullable": True,
        }
    },
    "x-patternProperties": {
        "^[a-z]+$": {
            "type": "number",
        }
    }
}

options = {"supportPatternProperties": True}
converted = to_json_schema(openapi_schema, options)

print(json.dumps(converted, indent=2))

This outputs the following JSON schema. This shows the conversion of nullable: True to type: ["string", "null"], and the enablement of unsupported JSON Schema features using OpenAPI extension fields (x-patternProperties -> patternProperties).

{
  "patternProperties": {
    "^[a-z]+$": {
      "type": "number"
    }
  },
  "properties": {
    "name": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object"
}

Options

The to_json_schema function accepts an options dictionary as the second argument.

# Defaults
options = {
    'cloneSchema': True,
    'dateToDateTime': False,
    'supportPatternProperties': False,
    'keepNotSupported': [],
    'patternPropertiesHandler':
        openapi_schema_to_json_schema.patternPropertiesHandler,
    'removeReadOnly': False,
    'removeWriteOnly': True,
}

cloneSchema (bool)

If set to False, converts the provided schema in place. If True, clones the schema using copy.deepcopy. Defaults to True.

dateToDateTime (bool)

This is False by default and leaves date format as is. If set to True, sets format: 'date' to format: 'date-time'.

For example

import json
from openapi_schema_to_json_schema import to_json_schema

schema = {
  'type': 'string',
  'format': 'date',
}

converted = to_json_schema(schema, {'dateToDateTime': True})

print(json.dumps(converted, indent=2))

prints

{
  "format": "date-time",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "string"
}

keepNotSupported (list)

By default, the following fields are removed from the result schema: nullable, discriminator, readOnly, writeOnly, xml, externalDocs, example and deprecated as they are not supported by JSON Schema Draft 4. Provide a list of the ones you want to keep (as strings) and they won't be removed.

removeReadOnly (bool)

If set to True, will remove properties set as readOnly. If the property is set as required, it will be removed from the required list as well. The property will be removed even if readOnly is set to be kept with keepNotSupported.

removeWriteOnly (bool)

Similar to removeReadOnly, but for writeOnly properties.

supportPatternProperties (bool)

If set to True and x-patternProperties property is present, change x-patternProperties to patternProperties and call patternPropertiesHandler. If patternPropertiesHandler is not defined, call the default handler. See patternPropertiesHandler for more information.

patternPropertiesHandler (function)

Provide a function to handle pattern properties and set supportPatternProperties to take effect. The function takes the schema where x-patternProperties is defined on the root level. At this point x-patternProperties is changed to patternProperties. It must return the modified schema.

If the handler is not provided, the default handler is used. If additionalProperties is set and is an object, the default handler sets it to false if the additionalProperties object has deep equality with a pattern object inside patternProperties. This is because we might want to define additionalProperties in OpenAPI spec file, but want to validate against a pattern. The pattern would turn out to be useless if additionalProperties of the same structure were allowed. Create you own handler to override this functionality.

See tests/to_jsonschema/test_pattern_properties.py for examples of this.

Credits

Release files for py-openapi-schema-to-json-schema 0.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for py-openapi-schema-to-json-schema 0.0.3
File Size Uploaded
py-openapi-schema-to-json-schema-0.0.3.tar.gz 6.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for py-openapi-schema-to-json-schema 0.0.3
File Interpreter ABI Platform
py_openapi_schema_to_json_schema-0.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 12.9 kB

Release files / py-openapi-schema-to-json-schema-0.0.3.tar.gz

Download URL py-openapi-schema-to-json-schema-0.0.3.tar.gz
Size 6.0 kB
Tags Source
SHA-256 checksum
How to use checksums
d557afb6bcc45d62a1383ada0ad57515421552efa3b2e07b2264e5b9e1e9634e
BLAKE2b-256 checksum
How to use checksums
51c55d6a9b08df175a886b4085eb51e0351854a96e4896a367b2373ad19d881b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.6.3

Release files / py_openapi_schema_to_json_schema-0.0.3-py3-none-any.whl

Download URL py_openapi_schema_to_json_schema-0.0.3-py3-none-any.whl
Size 7.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
456802186309257a9667fd50eca7c6ff6eaf9930ab09dcc87c54537e01066f09
BLAKE2b-256 checksum
How to use checksums
1c1aa43f73b8762512ab3358aac96c6c6d1d9ec4dbb3bbb99d82c2e90e5f3d16
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.6.3

Release history Release notifications | RSS feed

This release

0.0.3 This release

2 release files

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page