使用AJV中的json模式验证对象数组中的每个对象键

时间:2019-07-31 13:00:24

标签: json object schema ajv

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

[

  int[,] data2D = new int[demo.Length, demo.Length > 0 ? demo[0].Length : 0];

  for (int y = 0; y < demo.Length; ++y)
    for (int x = 0; x < demo[0].Length; ++x)
      data2D[y, x] = demo[y][x];

]

我已经写了一个架构,

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

但是我无法将每个键与一个运算符关联。我该怎么办?

1 个答案:

答案 0 :(得分:0)

这是一种使用“ 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数组。

“&”表示紧随约束。这里有三个顶级约束,每个约束都有一个“ comment”字段以指示正在发生的情况。简而言之:

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

  2. 第二个顶级约束条件表示“年龄字段只能获得等于和不等于运算符值”的条件。

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