首页 > 解决方案 > 使用 ajv 中的 json 模式验证对象数组中的每个对象键

问题描述

我有一个数组,其中包含具有不同键值的对象。我想验证每个对象键。例如,age 字段只能获取 Equal 和 Not equal 运算符值。所以每个键的“op”键是不同的。例如,名称应与包含运算符一起使用。

[

{ age:21, op: "Equal" },
{ name:21, op: "Contains" },
{ date: 1564577662198, op: "Not equal" }

]

我写了一个模式,

{
  "title": "ValidatorSchema",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "age":{
        "type": "number"
      },
      "operator" : {
        "type" : "string",
        "enum" : ["Equal" , "Not equal"]
      },
      "name":{
        "type": "string"
      },
      "operator" : {
        "type" : "string",
        "enum" : ["Contains"]
      }
     }
  }
}

但我无法将每个键与操作员联系起来。我该怎么做?

标签: jsonobjectschemaajv

解决方案


这是使用“ JSON Extended Structural Schema ”语言JESS表达需求的一种方法(据我所知) :

[
    ["&",
     {"comment": "https://stackoverflow.com/questions/57291339/validate-each-object-key-in-the-object-array-with-json-schema-in-ajv",
      "::<=":  {
                 "age": "number",
                 "operator": "string",
                 "name": "string",
                 "date": "number"
      }
     },
     { "comment": "age field can get only Equal and Not equal operator values",
       "ifcond": { "has": "age"},
       "then":   ["&", {"forall": ".[operator]", "enumeration": ["Equal", "Not equal"]}]
     },
     { "comment": "name should be used with Contains operator",
       "ifcond": { "forall": ".[operator]", "equal": "Contains" },
       "then":   ["&", {"has": "name" } ]
     }
    ]
]

解释

JESS 模式是 JSON 文本的集合。在这里,一个 JSON 文档就足够了,如上所示。

外部方括号表示目标 JSON 实体必须是 JSON 数组的要求。

“&”表示后面是约束的结合。这里有三个顶级约束,每个都有一个“评论”字段来指示正在发生的事情。简单来说:

  1. 第一个顶级约束表示要求数组的组件必须包含使用任何指定的键形成的对象,并带有所示的类型约束。

  2. 第二个顶级约束表示“age 字段只能获取 Equal 和 Not equal 运算符值”的条件。

  3. 第三个表示如果 .operator 的值是对象中的“包含”,则该对象必须具有“名称”键(其类型已在 (1.) 中指定)的约束。


推荐阅读