如何使用JSON Schema验证数组中所有对象的指定字段值完全相同?
问题
给定如下JSON Schema:
{ "type": "array", "items": { "type": "object", "properties": { "name": { "enum": ["Adam", "Daniel", "Mike"] }, "desc": { "type": ["string", "null"] } }, "required": [ "name" ] } }
能否验证数组中所有对象的name字段值完全相同?
示例:
- 有效示例1:
[ {"name": "Adam"}, {"name": "Adam", "desc": "good"}, ]
- 有效示例2:
[ {"name": "Mike"}, {"name": "Mike", "desc": "good"}, ]
- 无效示例:
[ {"name": "Adam"}, {"name": "Adam", "desc": "good"}, {"name": "Mike", "desc": "bad"}, ]
当然可以实现,给你两种可行方案:
方案1:用$data关键字(推荐)
这种方法需要你的JSON Schema解析器支持Draft 7及以上版本,能直接让数组里所有元素的name和第一个元素的name保持一致:
{ "type": "array", "minItems": 1, "items": { "type": "object", "properties": { "name": { "enum": ["Adam", "Daniel", "Mike"], "$data": "0/name" }, "desc": { "type": ["string", "null"] } }, "required": ["name"] } }
$data": "0/name"意思是当前元素的name必须和数组第一个元素(索引0)的name值完全一致minItems: 1是为了避免空数组的情况,毕竟空数组里没有第一个元素可参照
方案2:兼容不支持$data的解析器
如果你的解析器不支持$data,可以用contains加allOf的组合来实现:
{ "type": "array", "minItems": 1, "contains": { "properties": { "name": { "enum": ["Adam", "Daniel", "Mike"] } } }, "items": { "type": "object", "properties": { "name": { "enum": ["Adam", "Daniel", "Mike"] }, "desc": { "type": ["string", "null"] } }, "required": ["name"], "allOf": [ { "$ref": "#/contains" } ] } }
contains先定义数组里存在某个符合name枚举值的元素- 然后
items里的allOf引用这个规则,强制所有元素的name都和这个被定义的name保持一致
这两种方案都能满足需求,确保数组内所有对象的name字段值完全相同。
内容的提问来源于stack exchange,提问作者Andrei Khotko
相关产品推荐
相关产品推荐

