根据包含多个模式定义的JSON模式进行验证



我正在创建一个JSON模式用于Postman,其中有一些模式定义。我根据模式验证的JSON需要与其中一个模式定义匹配。

样本模式

{
"oneOf": [
{
"$ref": "#/definitions/schema1"
},
{
"$ref": "#/definitions/schema2"
},
{
"$ref": "#/definitions/schema3"
}
],
"definitions": {
"schema1": {
"type": "object",
"properties": {
"propertyA": {
"type": "string"
}
},
"required": [
"propertyA"
]
},
"schema2": {
"type": "object",
"properties": {
"propertyB": {
"type": "string"
}
},
"required": [
"propertyB"
]
},
"schema3": {
"type": "object",
"properties": {
"propertyC": {
"type": "string"
}
},
"required": [
"propertyC"
]
}
}
}

JSON数据示例

这个JSON将根据模式进行验证,并正确地标记为无效(因为需要字符串):

{
"propertyA": 123
}

这个例子根据https://www.jsonschemavalidator.net/:

返回4个错误
  • 消息:JSON对来自'oneOf'的无模式有效。模式路径:赛#/
  • 消息:无效类型。预期字符串,但得到整数。模式路径:#代码基于schema1中/定义/类型/属性/propertyA/
  • 消息:object: propertyC中缺少必需的属性。
    模式路径:#/definitions/schema3/required消息:object: propertyB中缺少必需的属性。
    模式路径:#/definitions/schema2/required

我只对说它需要一个String的错误消息感兴趣。如何在将模式定义保存在一个文件中的同时避免这些其他错误消息?

是的,oneOf在这种事情上很糟糕。if/then是冗长的,但是给你更好的结果。基本上,您需要确定一些条件,以确定模式是否应该应用于实例。

通常,该条件是公共字段的值。在这种情况下,如果要验证的实例是具有"type": "A"的对象,那么它必须针对/definitions/a模式进行验证。如果它有"type": "B",那么它必须针对/definitions/b模式进行验证。

{
"allOf": [
{
"if": {
"properties": {
"type": { "const": "A" }
},
"required": ["type"]
},
"then": { "$ref": "#/definitions/a" }
},
{
"if": {
"properties": {
"type": { "const": "B" }
},
"required": ["type"]
},
"then": { "$ref": "#/definitions/b" }
}
]
}

如果您的条件是存在特定字段,则可以使用dependencies关键字作为快捷方式。如果被验证的实例是一个带有属性的对象;属性,则该实例必须对/definitions/a模式有效。同样,对于"propertyB"

{
"dependencies": {
"propertyA": { "$ref": "#/definitions/a" },
"propertyB": { "$ref": "#/definitions/b" }
}
}

对于您的示例,实际上有一个超级简单的解决方案,但我回答的是一般情况,因为我假设您的实际模式比示例更复杂。

{
"type": "object",
"properties": {
"propertyA": { "type": "string" },
"propertyB": { "type": "string" },
"propertyC": { "type": "string" }
},
"oneOf": [
{ "required": ["propertyA"] },
{ "required": ["propertyB"] },
{ "required": ["propertyC"] }
]
}

相关内容

  • 没有找到相关文章

最新更新