如何验证含可变长度对象数组的JSON Schema?
问题
无法验证包含数组的JSON Schema,尤其是当不同请求中数组内的对象数量不同时。
示例响应:
{ "name": "value", "id": "value", "arrayField": [], "objects": [ { "Field1": "value", "Field2": false }, { "Field1": "value", "Field2": true } ] }
注意:其他请求的objects数组可能包含更多对象,需要确保每个对象中Field1和Field2字段存在且类型正确。
在Feature文件中使用的验证写法:
def expectedSchema = read('path to json') match response == expectedSchema
尝试两种方案均失败:
- 方案1:因对象数量不同验证失败
{ "name": "#string", "id": "#string", "arrayField": "#array", "objects": [ { "Field1": "#string", "Field2": "#boolean" }, { "Field1": "#string", "Field2": "#boolean" } ] }
- 方案2:触发错误
$ | not equal | actual does not contain key - '#array' (MAP:MAP)
{ "name": "#string", "id": "#string", "arrayField": "#array", "objects": "#array", "#array": [ "Field1": "#string", "Field2": "#boolean" ] }
请问是否存在可以成功验证该Schema的方法?
解决方案
使用数组元素匹配语法指定数组内对象的通用结构,就能解决数组长度不一致的校验问题,同时确保每个对象的字段符合要求。
正确的JSON Schema写法如下:
{ "name": "#string", "id": "#string", "arrayField": "#array", "objects": "#array[#object]", "#object": { "Field1": "#string", "Field2": "#boolean" } }
关键语法说明:
#array[#object]:声明objects是一个数组,且数组中的每一个元素都必须遵循#object定义的结构#object:定义了数组内对象的强制字段和类型,不管数组有多少个元素,只要每个元素都满足这个规则就能通过校验
用这个Schema验证时,无论objects数组包含1个还是多个对象,只要每个对象都有字符串类型的Field1和布尔类型的Field2,就能顺利通过匹配,不会再因为数组长度不同或语法错误失败。
内容的提问来源于stack exchange,提问作者TimLks
相关产品推荐
相关产品推荐

