根据属性值使用 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 中的所有内容,所以它应该可以工作。