无论如何,要让 JSON 模式在不使用类型“null”的情况下将 null OR 字符串类型识别为有效

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

提问人:Rockwell Rice 提问时间:11/3/2023 最后编辑:Rockwell Rice 更新时间:11/5/2023 访问量:48

问:

我知道对此的典型反应是使用

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

但是我们拥有的 OpenAPI 版本是 3.0.x,而不是 3.1,因此类型不可用。我正在尝试找到一种方法来让我们的 JSON 验证可以是 OR 的字段nullstringnull

当前字段是

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

但这并不能验证 null 条目是否有效。如果我将

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

它确实正确地验证了它,但是在编译 swagger 文档时显示时髦,所以我试图找到一种方法来允许字符串或 null,验证它并让它正确显示。如上所述,它将所有内容显示为文档中类型的一个单词。stringnull

我尝试过使用JSON模式版本

OpenAPI 版本 3.0.1

json ruby-on-rails swagger-ui jsonschema rswag

评论


答:

3赞 Jeremy Fiel 11/4/2023 #1

OAS 3.0.x 具有为此目的定义的属性nullable

您使用的是哪个验证器?它可能没有实现这个关键词,这就是为什么你在使用它时遇到问题。

您可以验证它是否适用于 hyperjump-io

换出 and 以尝试不同的实例。datadata2

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"
                    }
                }
            }
        }
    }
}

它在 Swagger-UI 免费版本上正确显示。

swagger-ui

评论

1赞 Rockwell Rice 11/6/2023
我们使用一种叫做 json_schemer 的宝石。所以我会看看它是否没有内置,也许我们可以切换到一些东西,感谢您的回复!