无论如何,要让 JSON 模式将 null 或字符串类型识别为有效,而不使用类型“null”

问题描述 投票:0回答:1

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

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

但是我们拥有的 OpenAPI 版本是 3.0.x,而不是 3.1,因此

null
的类型不可用。我正在尝试找到一种方法让我们的 JSON 验证可以是
string
null

的字段

当前字段是

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

但这并不能验证空条目是否有效。如果我设置

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

它确实正确地验证了它,但是在编译 swagger 文档时这显示得很奇怪,所以我试图找到一种方法来允许字符串或空值,验证它并让它正确显示。通过以上内容,它会将文档中的类型全部显示为一个单词

stringnull

我尝试过 JSON 模式版本

OpenAPI版本3.0.1

json ruby-on-rails swagger-ui jsonschema rswag
1个回答
2
投票

OAS 3.0.x 有一个

nullable
为此目的定义的属性

您使用哪个验证器?它可能没有实现此关键字,这就是您在使用它时遇到问题的原因。

您可以使用 hyperjump-io

验证它是否有效

交换

data
data2
以尝试不同的实例。

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 免费版本上正确显示。

© www.soinside.com 2019 - 2024. All rights reserved.