json - 使用 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"]
}
}
}
}
但我无法将每个键与操作员联系起来。我该怎么做?
解决方案
这是使用“ 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 数组的要求。
“&”表示后面是约束的结合。这里有三个顶级约束,每个都有一个“评论”字段来指示正在发生的事情。简单来说:
第一个顶级约束表示要求数组的组件必须包含使用任何指定的键形成的对象,并带有所示的类型约束。
第二个顶级约束表示“age 字段只能获取 Equal 和 Not equal 运算符值”的条件。
第三个表示如果 .operator 的值是对象中的“包含”,则该对象必须具有“名称”键(其类型已在 (1.) 中指定)的约束。
推荐阅读
- python - 无法从 CDK 定义“FARGATE”AWS Batch 计算环境
- c - 我在 C 中实现二进制搜索,我遇到了这个问题,即它没有打印元素的索引号
- angular - 在“@firebase/firestore”中找不到导出“registerFirestore”(导入为“registerFirestore”)
- reactjs - react - 上传图片并将上传路径 URL 附加到数据库条目
- c++ - 将 1 个大型 C++ 类拆分为多个类,同时仍使用原始类成员语法
- javascript - HTML + Javascript - 我可以移动或调整多个 div 元素的大小,但不能同时移动两者
- regex - Golang 正则表达式:我如何过滤损失(...):{value} 搅拌
- docker - 来自 docker 容器的暴露端口无法通过 RedHat 8 中的 IP 地址访问主机服务器
- python - 通过 conda 安装特定版本的 spyder
- python - 如何自动将日期和时间添加到数据框索引中?