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
相关产品推荐
相关产品推荐

