Karate框架下如何比较两个JSON结构并返回键值比对结果
Karate框架下JSON全量结构与键值比对方案
你当前的代码只截取了匹配结果的pass布尔标识,丢弃了Karate内置match方法返回的完整差异信息,所以只能拿到是否匹配的结论,看不到具体校验结果。Karate原生的karate.match()本身就支持完整的JSON结构、字段类型、键值比对,不需要额外开发工具类,直接调整代码即可实现需求。
可直接运行的实现代码
// 执行两个JSON的全量匹配 def matchRes = karate.match(result1, result2) // 组装最终返回结果,包含匹配状态和具体差异信息 def finalCompareResult = { isMatch: matchRes.pass, compareDetail: matchRes.pass ? "JSON结构、键值完全匹配" : matchRes.message } // 打印完整比对结果 print finalCompareResult
不同比对需求的适配方式
- 仅校验结构、不校验具体键值:将作为比对基准的JSON中不需要校验值的字段替换为
'#ignore'即可,例如基准值写为{userId: '#ignore', userName: '#ignore', orderList: '#ignore'},匹配时只会校验这些字段是否存在、层级结构是否一致,不会校验具体内容 - 校验结构+值类型、不校验具体值:将对应字段替换为类型校验标记,支持的标记包括
'#string'(字符串类型)、'#number'(数字类型)、'#boolean'(布尔类型)、'#array'(数组类型)、'#object'(对象类型),匹配时会自动校验字段存在且类型符合要求 - 忽略部分指定字段的比对:直接在基准JSON中删除对应字段,或者给对应字段赋值
'#ignore',该字段就不会纳入比对范围 - 严格模式比对:如果要求两个JSON完全一致,不能多字段也不能少字段、值完全相等,直接传入两个原始JSON做match即可,不需要做任何标记处理
比对结果说明
- 当两个JSON符合匹配规则时,
isMatch字段为true,compareDetail会提示匹配成功 - 当存在结构不匹配(缺字段、多余字段、层级结构错误、字段类型错误)或者键值不匹配时,
isMatch字段为false,compareDetail会明确标注差异所在的字段路径、预期内容和实际内容,直接查看打印结果即可定位问题。
内容的提问来源于stack exchange,提问作者kannuri vijayalakshmi
相关产品推荐
相关产品推荐

