是否可以根据另一个字段的值更改字段的架构?
注意:我正在使用Ajv
使用Joi(非 JSON 模式验证器)的示例:
const schema = {
a: Joi.valid('x', 'y', 'z'),
b: Joi.string()
.when('a', { is: 'z', then: Joi.string(), otherwise: Joi.number() }),
};
最直接的方法是根据$data 指针建立一个 $ref 链接。不幸的是,目前不支持。
使用应用程序逻辑可能会更干净,但如果您处于必须使用模式的情况,则更详细的方法是使用oneOf。在那种情况下,您的架构将类似于:
var ajv = new Ajv({
$data: true
});
let schema = {
oneOf: [
{
title: 'A is Z',
type: 'object',
properties: {
a: {
type: 'string',
enum: ['z']
},
b: {
type: 'string'
}
}
},
{
title: 'A is not Z',
type: 'object',
properties: {
a: {
type: 'string',
not: {
enum: ['z']
}
},
b: {
type: 'number'
}
}
}
]
};
let data = {
a: 'z',
b: '5'
};
ajv.validate(schema, data)
console.log('ERRORS: ', this.ajv.errors)
<script data-require="ajv@*" src="https://cdnjs.cloudflare.com/ajax/libs/ajv/5.3.0/ajv.bundle.js"></script>
编辑:由于您使用的是 AJV,您还可以利用AJV-Keywords 模块。它有一个if / then / else运算符,目前是添加到规范的提议。