提问者:小点点

JSON模式,验证数组中只有一个对象的属性等于值


我有一个有效负载,我想使用JSON模式来验证它,但在这种情况下,我不知道如何转换为模式。

假设我有这个对象:

{
  jobs: [
    { title: "Developer", salary: "100", actual: false },
    { title: "Plumber", salary: "200", actual: true },
    { title: "Teacher", salary: "100", actual: false }
  ]
}

我想编写一个模式,用于验证如果jobs数组中存在对象,则其中一个(且仅有一个)必须将actual键设置为true

这可能吗?


共2个答案

匿名用户

您可以查看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
}