使用基于属性值的JSONPath在Wiremock中返回json

时间:2015-07-17 17:10:26

标签: json jsonpath wiremock

我正在尝试使用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?

1 个答案:

答案 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中的所有内容,因此它应该可以正常工作。