我有一个案例,我需要再次验证json json架构取决于其中一个属性中的值,在json架构术语中枚举属性
这是json
{
"req":
{
user:"",
company:"",
dept:"",
class:""
reqType:"account"
}
}
reqType可以根据应该需要的字段之一来占用不同的值,例如account,dept,classs
我已尝试使用anyOf相同,但它没有正确验证前 - 我已尝试下面的架构
{
"$id": "http://example.com/example.json",
"type": "object",
"definitions":
{},
"$schema": "http://json-schema.org/draft-07/schema#",
"properties":
{
"req":
{
"$id": "/properties/req",
"type": "object",
"properties":
{
"user":
{
"$id": "/properties/req/properties/user",
"type": "string",
"title": "The User Schema ",
"default": "",
"examples": [
"a"
]
},
"company":
{
"$id": "/properties/req/properties/company",
"type": "string",
"title": "The Company Schema ",
"default": "",
"examples": [
"b"
]
},
"dept":
{
"$id": "/properties/req/properties/dept",
"type": "string",
"title": "The Dept Schema ",
"default": "",
"examples": [
"c"
]
},
"class":
{
"$id": "/properties/req/properties/class",
"type": "string",
"title": "The Class Schema ",
"default": "",
"examples": [
"d"
]
},
"reqType":
{
"$id": "/properties/req/properties/reqType",
"type": "string",
"title": "The Reqtype Schema ",
"default": "",
"examples": [
"account"
],
"enum": [
"account", "dept", "class"
]
}
},
"required": [
"reqType"
],
"anyOf": [
{
"properties":
{
"reqType":
{
"enum": ["account"]
}
},
"required": ["user", "company"]
},
{
"properties":
{
"reqType":
{
"enum": ["dept"]
}
},
"required": ["dept"]
}]
}
},
"required": [
"req"
]
}
这似乎工作正常,当它满足所有条件,但当我检查其中一个失败的情况下它会抛出我的错误如下
[ { keyword: 'required',
dataPath: '.req',
schemaPath: '#/properties/req/anyOf/0/required',
params: { missingProperty: 'user' },
message: 'should have required property \'user\'',
schema: [ 'user', 'company' ],
parentSchema: { properties: [Object], required: [Array] },
data: { company: 'b', dept: 'c', class: 'd', reqType: 'account' } },
{ keyword: 'enum',
dataPath: '.req.reqType',
schemaPath: '#/properties/req/anyOf/1/properties/reqType/enum',
params: { allowedValues: [Array] },
message: 'should be equal to one of the allowed values',
schema: [ 'dept' ],
parentSchema: { enum: [Array] },
data: 'account' },
{ keyword: 'anyOf',
dataPath: '.req',
schemaPath: '#/properties/req/anyOf',
params: {},
message: 'should match some schema in anyOf',
schema: [ [Object], [Object] ],
parentSchema:
{ '$id': '/properties/req',
type: 'object',
properties: [Object],
required: [Array],
anyOf: [Array] },
data: { company: 'b', dept: 'c', class: 'd', reqType: 'account' } } ]
它应该首先给出错误,并且应该已经验证了第二种情况,而不是说它没有得到枚举值,我在这里做错了什么
1 回答
你说得对 .
anyOf
关键字表示一个或多个给定模式必须有效 .它检查第一个并发现
enum
关键字通过,但required
关键字失败 . 因此,此架构失败 .因此,它转到下一个模式,发现
enum
关键字失败并且required
关键字通过 . 因此,此架构也会失败 .anyOf
找不到有效的架构,因此失败并报告两个架构都没有通过验证 .你看,
anyOf
不知道enum
在这个模式中有特殊含义 . 两个模式都有一个通过的关键字和一个失败的关键字 . 至anyOf
,他们是一样的 .这是一个替代方案,可以为您提供稍微更好的错误消息 . 错误消息最终仍然非常神秘,但它们专注于问题所在 .