未知键名时,如何在Karate中操作Map及校验JSON Schema?
嘿,这两个关于Karate框架的问题我刚好有经验,给你详细说说怎么解决:
问题1:访问未知键名的Map中的单个值
当然可以!Karate提供了karate.keysOf()工具函数,能帮你获取Map的所有键名组成的数组,之后你就可以通过索引拿到任意键,再访问对应的值。
举个实际例子,假设你的响应或变量结构是这样的:
{ "randomKey_abc": "foo", "randomKey_xyz": "bar" }
你可以这样获取第一个值:
# 获取所有键名的数组 * def keys = karate.keysOf(response) # 通过第一个键访问对应的值 * def firstValue = response[keys[0]] # 输出会是 "foo"
如果想更简洁,甚至可以一行搞定:
* def anyValue = response[karate.keysOf(response)[0]]
要是你需要获取最后一个值,用keys[-1]就行,Karate支持负索引哦。
问题2:校验未知键下所有JSON对象的Schema
这个需求也很常见,Karate的karate.valuesOf()和match each组合起来就能完美解决。
假设你的目标结构是:
{ "Content": { "Key1": { "id": 1, "name": "Alice" }, "Key2": { "id": 2, "name": "Bob" } } }
步骤如下:
- 先定义你要校验的Schema(也可以从外部文件读取):
* def userSchema = """ { "type": "object", "properties": { "id": { "type": "number" }, "name": { "type": "string" } }, "required": ["id", "name"] } """
- 提取Content下的所有值为数组,然后批量校验:
# 获取Content下所有值的数组 * def contentObjects = karate.valuesOf(response.Content) # 对数组里的每个对象应用Schema校验 * match each contentObjects == userSchema
如果你的Schema存在外部文件(比如classpath:schemas/user-schema.json),直接用read()加载就行:
* def userSchema = read('classpath:schemas/user-schema.json') * def contentObjects = karate.valuesOf(response.Content) * match each contentObjects == userSchema
这种方式不管Content下有多少个未知键,都会逐个校验对应的JSON对象是否符合Schema,非常高效。
内容的提问来源于stack exchange,提问作者Shriram
相关产品推荐
相关产品推荐

