You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:45:28