我有一个有效负载,我想使用JSON模式来验证它,但在这种情况下,我不知道如何转换为模式。
假设我有这个对象:
{
jobs: [
{ title: "Developer", salary: "100", actual: false },
{ title: "Plumber", salary: "200", actual: true },
{ title: "Teacher", salary: "100", actual: false }
]
}
我想编写一个模式,用于验证如果jobs
数组中存在对象,则其中一个(且仅有一个)必须将actual
键设置为true
。
这可能吗?
您可以查看joi
库并尝试自定义方法
null
const schema = joi.object({
jobs: joi.array().custom((value, helper) => {
if (value.filter((el) => el.actual === true).length === 1) {
return true
} else {
return helper.error("any.invalid")
}
}),
})
const res1 = schema.validate({
jobs: [
{ title: "Developer", salary: "100", actual: false },
{ title: "Plumber", salary: "200", actual: true },
{ title: "Teacher", salary: "100", actual: false },
],
})
const res2 = schema.validate({
jobs: [
{ title: "Developer", salary: "100", actual: false },
{ title: "Plumber", salary: "200", actual: false },
{ title: "Teacher", salary: "100", actual: false },
],
})
const res3 = schema.validate({
jobs: [
{ title: "Developer", salary: "100", actual: true },
{ title: "Plumber", salary: "200", actual: true },
{ title: "Teacher", salary: "100", actual: false },
],
})
console.log(res1.error === undefined)
console.log(res2.error === undefined)
console.log(res3.error === undefined)
<script src="https://www.unpkg.com/joi@17.2.1/dist/joi-browser.min.js"></script>
您可以循环抛出作业,检查它们的实际键是否设置为true,以及一个计数器,检查它们中是否有一个且仅有一个设置为true。在这种特殊情况下,您不能使用诸如ajv
这样的库,这是理想的。
示例:
function (object) {
let counter = 0
object.jobs.forEach((job) => {
if (job.actual === true) {
counter++
}
})
if (counter > 1) return false
else return true
}