json 如何使用ajv验证字段相互依赖的对象模式?

icnyk63a  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(98)

我正在使用ajv节点包来验证我的模式。假设一个字段保存一个对象类型。
该对象可以具有3个属性:"A", "B", and "C" .
如何指定至少必须定义其中一个属性,而不允许定义其他属性?

bq3bfh9z

bq3bfh9z1#

根据您是要禁止 * 所有 * 其他属性还是只禁止特定的其他属性(如果存在“A”,则禁止“B”和“C”,但“foo”仍然可以),您可以将oneOfadditionalProperties: false属性一起使用,也可以使用not来禁止特定属性。
施梅玛:

{
  "anyOf": [
    {
      "properties": {"A": {}},
      "required": ["A"],
      "additionalProperties": false
    },
    {
      "properties": {
        "B": {},
        "A": { "not": {} },
        "C": { "not": {} }
      },
      "required": ["B"],
    }
  ]
}

注意:模式"not": {}始终为false,因此对应属性的值永远无法满足它。
此示例使用additionalProperties: false表示“A”,因此它匹配

{
      "A": 3
}

但两者都不是

{
    "A": 3,
    "B": 5
}

{
    "A": 3,
    "foo": 5
}

另一方面,该示例对“B”使用not,因此它匹配

{
      "B": 3
}

{
    "B": 3,
    "foo": 5
}

但不

{
    "A": 3,
    "C": 5
}
8yoxcaq7

8yoxcaq72#

您可以使用anyOf作为此约束条件。anyOf关键字允许您使用布尔OR运算合并约束条件。

{
  "anyOf": [
    { "required": ["A"] },
    { "required": ["B"] },
    { "required": ["C"] }
  ]
}

相关问题