【问题标题】:Wildcard in JsonPathJsonPath 中的通配符
【发布时间】:2017-06-21 14:21:35
【问题描述】:

我正在解析如下 JSON:

jobs1: [
{
  request: {
    body: {
      jobID: "79ceeeff-53b9-4645-80bd-95dfca6fe1e9",
...
jobs2: [
{
  request: {
    body: {
      jobID: "60e7c286-f936-4f96-87bc-6bd55f107514",

并且正在寻找一种在 JSON 路径中使用通配符的方法。

我在 Java 中使用 RestAssured 框架。执行如下代码后:

List<String> ids = get("/state/").path("*.request.body.jobID");
System.out.println(ids);

我希望得到:

[79ceeeff-53b9-4645-80bd-95dfca6fe1e9, 60e7c286-f936-4f96-87bc-6bd55f107514]

但是我得到了一个例外:

java.lang.IllegalArgumentException: Invalid JSON expression:
Script1.groovy: 1: unexpected token: *. @ line 1, column 27.
                        *.request.body.jobID
                         ^

我浏览了这些教程,但似乎没有什么对我有用:

https://github.com/json-path/JsonPath

http://goessner.net/articles/JsonPath

如何在 JsonPath 中正确使用通配符?

【问题讨论】:

  • 您是否尝试过使用children 而不是*?参照。 github.com/rest-assured/rest-assured/wiki/…groovy-lang.org/processing-xml.html#_gpath
  • @D.Kovács "children().request.body.jobID" 给了IllegalArgumentException: No signature of method: java.util.HashMap.children() is applicable for argument types: () values: []
  • 我也在试图弄清楚如何使用通配符。但是,如果您需要临时解决方案,则可以使用以下方法。 def jsonSlurper = 新的 JsonSlurper(); def jsonResponse = jsonSlurper.parseText(sampleJson); def listOfJobIds = []; jsonResponse.keySet().each{node -> listOfJobIds.add(jsonResponse[node].request.body.jobID[0]); } log.info listOfJobIds;

标签: java json groovy rest-assured jsonpath


【解决方案1】:

转到http://jsonpath.herokuapp.com/

并在给定图像中像绿色框一样输入。

您的模式应该如下所示

*.[*].request.body.jobID

您的 JSON 应该如下所示

{
	jobs1: [{
			request: {
				body: {
					jobID: "79ceeeff-53b9-4645-80bd-95dfca6fe1e9"
				}
			}
		}
	],
	jobs2: [{
			request: {
				body: {
					jobID: "60e7c286-f936-4f96-87bc-6bd55f107514"
				}
			}
		}
	]
}

你会得到如下结果

[
   "79ceeeff-53b9-4645-80bd-95dfca6fe1e9",
   "60e7c286-f936-4f96-87bc-6bd55f107514"
]

【讨论】:

    【解决方案2】:

    *.[*].request.body.jobID 这将单独提取 jobID,如下所示

    [  
       "79ceeeff-53b9-4645-80bd-95dfca6fe1e9",
       "60e7c286-f936-4f96-87bc-6bd55f107514"
    ]
    

    【讨论】:

      【解决方案3】:

      你真的需要wildcards吗?这似乎能够检索您所期望的:

      ..request.body.jobID
      

      甚至更简单:

      ..jobID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        相关资源
        最近更新 更多