WireMock中单个matchingJsonPath实现跨层级AND条件匹配问题
WireMock跨层级JSONPath多条件匹配实现
问题背景
给定请求JSON:
{ "id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" }, { "id": "1003", "type": "Blueberry" }, { "id": "1004", "type": "Devil's Food" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5005", "type": "Sugar" }, { "id": "5007", "type": "Powdered Sugar" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5003", "type": "Chocolate" }, { "id": "5004", "type": "Maple" } ] }
需要匹配同时满足以下两个条件的请求:
batters.batter数组中存在id为1001的元素topping数组中存在id为5001的元素
目前已通过多次调用withRequestBody实现匹配:
.withRequestBody(matchingJsonPath("$.batters.batter[?(@.id == '1001')]")) .withRequestBody(matchingJsonPath("$.topping[?(@.id == '5001')]"))
需求:使用单个matchingJsonPath结合AND运算符完成跨层级条件匹配,当前使用WireMock 2.33版本。
实现方案
WireMock 2.x支持的JSONPath语法允许通过&&连接跨层级的条件表达式,将两个数组存在性判断整合到一个JSONPath中,具体写法有两种:
写法一:使用contains关键字
.withRequestBody(matchingJsonPath("$[?(@.batters.batter[*].id contains '1001' && @.topping[*].id contains '5001')]"))
写法二:使用some方法(更直观)
.withRequestBody(matchingJsonPath("$[?(@.batters.batter.some(item => item.id == '1001') && @.topping.some(item => item.id == '5001'))]"))
说明
- 两种写法均以根路径
$为基础,通过?()包裹复合条件,用&&连接两个独立的数组存在性检查。 contains关键字直接检查数组元素的id集合是否包含目标值,适合简单场景。some方法遍历数组,判断是否存在满足item.id == '目标值'的元素,逻辑更清晰,可读性更强。
内容的提问来源于stack exchange,提问作者Deep
相关产品推荐
相关产品推荐

