我正在尝试使用Wiremock进行存根,以根据发布请求中发送的正文提供响应。
例如,发送此json:
{
"person": {
"firstName": "paul",
"age": "50"
}
}
我想发送pauldata.json
这是我的请求/回应json:
{
"request": {
"method": "POST",
"url": "/api/test1",
"bodyPatterns": [
{
"matchesJsonPath": "$.person[?(@.firstName=='paul')]"
}
]
},
"response": {
"status": 200,
"bodyFileName": "pauldata.json",
"headers": {
"Content-Type": "application/json"
}
}
}
然而,这会导致错误:
JSON路径表达式'$ .person [?(@。firstName =='paul')]'由于错误'net.minidev.json.JSONObject无法转换为java.util.List而无法匹配文档
这个表达式:$ .person [?(@。firstName =='paul')]匹配json与http://jsonpath.herokuapp.com/的Jayway实现,但不匹配Wiremock使用的Goessner实现。
我注意到如果我只是在jayway中执行$ .person.firstName,它会返回“paul”, 但是当我在Goessner做同样的事情时,我得到了[“paul”]。
如何使用JSONPath的Goessner实现匹配key的值,以便根据数据中键的值返回自定义json?
答案 0 :(得分:2)
WireMock不接受所有JSONPath表达式,尽管它们可以在在线测试人员中使用。我遇到了同样的问题,并使用以下方法解决了这个问题:
{
"request": {
"method": "POST",
"url": "/api/test1",
"bodyPatterns": [
{
"matchesJsonPath": "$..[?(@.firstName=='paul')]"
}
]
},
"response": {
"status": 200,
"bodyFileName": "pauldata.json",
"headers": {
"Content-Type": "application/json"
}
}
}
唯一改变的是:
$.person[?(@.firstName=='paul')]
要:
$..[?(@.firstName=='paul')]
这是因为..符号以递归方式搜索所有输入。
如果您需要查询根元素,意味着没有父元素的根元素,则相同的JSONPath将执行此操作。例如,假设您有另外一个元素:
{
"person": {
"firstName": "paul",
"age": "50"
},
"test": "true"
}
如果你想匹配“test”:“true”,你需要JSONPath,如下所示:
$..[?(@.test=='true')]
我测试了WireMock中的所有内容,因此它应该可以正常工作。