Anyway to get JSON schema to recognize null OR string type as valid without using type "null"

123 Views Asked by At

I understand that the typical response to this is to use

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

But the OpenAPI version we have is 3.0.x, not 3.1 so the type of null is not available. I am trying to find a way to get our JSON to validate a field that can be either a string OR null

Current field is

  "type":"string",
  "pattern": "...actual pattern is kind of long...",
  "example": "2018-08-28",
  "description": "Description of the field here.",
  "nullable":true,

But this doe snot validate a null entry as valid. If I set

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

It does validate it correctly, however this displays funky when compile the swagger docs so I am trying to find a way to allow a string or null, validate it AND get it to display correctly. With the above it displays all as one word stringnull for the type in the docs.

I have tried with JSON schema versions

OpenAPI version 3.0.1

1

There are 1 best solutions below

1
On

OAS 3.0.x has a nullable property they have defined for this purpose

Which validator are you using? It may not have implemented this keyword which is why you're having trouble using it.

You can validate it works with hyperjump-io

swap out the data and data2 to try the different instances.

import { validate } from "@hyperjump/json-schema/openapi-3-0"
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);


let data = {
  "port": null
}

let data2 = {
  "port": "test"
}

try {

  
  let valid = await validate(`file://${__dirname}/test.openapi.json#/components/schemas/some_prop`, data)


  console.log({ valid, errors: { ...valid.errors } })
} catch (err) {
  console.error(err.message)
}

#test.openapi.json
{
    "openapi": "3.0.3",
    "info": {
        "title": "blah",
        "version": "1.1.0"
    },
    "paths": {
        "/v1/apis": {
            "get": {
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/some_prop"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "some_prop": {
                "type": "object",
                "properties": {
                    "port": {
                        "type": "string",
                        "nullable": true,
                        "pattern": "^[a-z]$",
                        "description": "description here",
                        "example": "jeremy"
                    }
                }
            }
        }
    }
}

it shows up correctly on Swagger-UI free version.

swagger-ui