根据属性值使用 JSONPath 在 Wiremock 中返回 json
Returning json in Wiremock using JSONPath based on attribute value
我正在尝试使用 Wiremock 存根以根据 post 请求中发送的正文提供响应。
例如,发送此 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 path expression '$.person[?(@.firstName=='paul')]' failed to match document because of error 'net.minidev.json.JSONObject cannot be cast to java.util.List
此表达式:$.person[?(@.firstName=='paul')] 将 json 与 http://jsonpath.herokuapp.com/ 处的 Jayway 实现相匹配,但不匹配 Goessner 实现Wiremock 使用。
我注意到如果我只是做 $.person.firstName 在 jayway it returns "paul",
但是当我在 Goessner 中做同样的事情时,我得到 ["paul"]。
我如何使用 JSONPath 的 Goessner 实现来匹配键的值,以便我可以 return 基于我数据中键的值的自定义 json?
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 中的所有内容,所以它应该可以工作。
我正在尝试使用 Wiremock 存根以根据 post 请求中发送的正文提供响应。
例如,发送此 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 path expression '$.person[?(@.firstName=='paul')]' failed to match document because of error 'net.minidev.json.JSONObject cannot be cast to java.util.List
此表达式:$.person[?(@.firstName=='paul')] 将 json 与 http://jsonpath.herokuapp.com/ 处的 Jayway 实现相匹配,但不匹配 Goessner 实现Wiremock 使用。
我注意到如果我只是做 $.person.firstName 在 jayway it returns "paul", 但是当我在 Goessner 中做同样的事情时,我得到 ["paul"]。
我如何使用 JSONPath 的 Goessner 实现来匹配键的值,以便我可以 return 基于我数据中键的值的自定义 json?
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 中的所有内容,所以它应该可以工作。