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

Wiremock Standalone为何拒绝我的合法JSONPath表达式?

Wiremock JSONPath匹配报错问题解析

背景

我正在使用wiremock-jre8-standalone-2.35.0.jar,需求是:当请求的数组字段包含值时返回200响应,数组为空时返回400响应。我配置了如下请求匹配规则:

{
  "id": "...",
  "request": {
    "urlPattern": "...",
    "method": "POST",
    "headers": {...},
    "bodyPatterns": [
      {
        "matchesJsonPath": "$[?(@.length < 1)]"
      }
    ]
  },
  "response": {
    "status": 400,
    "bodyFileName": "...",
    "headers": {...}
  },
  "uuid": "..."
}

问题

Wiremock拒绝了bodyPatterns中的JSONPath表达式,报错:[{"matchesJsonPath":"$[?(@.length < 1)]"}] is not a valid match operation,但该表达式在JSONPath验证工具上测试有效,输入空数组请求时能匹配成功,请问原因是什么?

原因及解决方案

Wiremock 2.x版本使用的是Jayway JsonPath实现,和部分在线验证工具采用的JSONPath语法规范存在差异:

  • 你使用的@.length语法在Jayway中不被支持,数组长度判断需要用size()函数替代
  • 空数组的匹配可以简化写法,无需额外的过滤条件包裹

修正后的JSONPath表达式可以写为:

"matchesJsonPath": "$[size(@) == 0]"

如果你的数组是请求体中的某个具体字段(比如items字段),则表达式应调整为:

"matchesJsonPath": "$.items[size(@) == 0]"

修正后的完整配置示例:

{
  "id": "...",
  "request": {
    "urlPattern": "...",
    "method": "POST",
    "headers": {...},
    "bodyPatterns": [
      {
        "matchesJsonPath": "$[size(@) == 0]"
      }
    ]
  },
  "response": {
    "status": 400,
    "bodyFileName": "...",
    "headers": {...}
  },
  "uuid": "..."
}

另外,若需匹配数组非空的场景(返回200),对应的表达式为:

"matchesJsonPath": "$[size(@) > 0]"

内容的提问来源于stack exchange,提问作者friend.code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:06:00