当前位置: 首页 > 知识库问答 >
问题:

如何在匿名和嵌套数组中使用查找或findAll在groovy的闭包中使用REST-Asure库进行搜索?

斜瑞
2023-03-14

我有以下JSON响应匿名正文,我需要动态解析嵌套数组,以便在chovy的闭包中使用findfindAll根据条件检索键的值

[
{
  "children": [
    {
      "attr": {
        "reportId": "1",
        "reportShortName": "ABC",
        "description": "test,
      }
    },
   {
     "attr": {
       "reportId": "2",
       "reportShortName": "XYZ",
       "description": "test",
      }
   }
}
]

我尝试了以下方法,但没有从JSON响应中检索reportId键的值

package com.src.test.api;
import static io.restassured.RestAssured.given;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;

public class GetReportId {
   public void getReportId(String reportName) throws Exception {
    String searchReports = "http://localhost:8080/reports";
    Response resp=given().request().when().get(searchReports).then().extract().response();
    JsonPath jsonPath = new JsonPath(resp.asString());

    String reportId1 =jsonPath.get("$.find{it.children.contains(restAssuredJsonRootObject.$.children.find{it.attr.reportShortName == 'ABC'})}.attr.reportId");
    String reportId2 = jsonPath.get("$.find{it.children.attr.reportShortName.contains(restAssuredJsonRootObject.$.children.find{it.attr.reportShortName.equals('XYZ')}.attr.reportShortName)}.attr.reportId");
    System.out.println("ReportId: " + reportId1);
  }
}

父匿名数组中可能有多个JSON对象,需要在groovy闭包中使用find或findAll来获取reportId

需要获取< code>reportId,但似乎有问题。任何帮助都将不胜感激。

共有1个答案

瞿文柏
2023-03-14

假设您想要所有ReportID

List<String> reportIds = jsonPath.get("children.flatten().attr.reportId");

会给你想要的,即使父匿名数组有多个条目。

我用下面的JSON进行了测试

[
  {
    "children": [
      {
        "attr": {
          "reportId": "1",
          "reportShortName": "ABC",
          "description": "test"
        }
      },
      {
        "attr": {
          "reportId": "2",
          "reportShortName": "XYZ",
          "description": "test"
        }
      }
    ]
  },
  {
    "children": [
      {
        "attr": {
          "reportId": "3",
          "reportShortName": "DEF",
          "description": "test"
        }
      },
      {
        "attr": {
          "reportId": "4",
          "reportShortName": "IJK",
          "description": "test"
        }
      }
    ]
  }
]

它给了我<code>〔“1”、“2”、“3”、“4”〕

如果您知道要查找的reportId的索引,那么您可以这样使用它:

String reportId = jsonPath.get("children.flatten().attr.reportId[0]");

如果您要查找特定报告的 reportId,您也可以执行以下操作:

String reportId = jsonPath.get("children.flatten().attr.find{it.reportShortName == 'ABC'}.reportId")

会给你< code >“1”。

注意:您分配结果的变量的类型对于类型推断和转换很重要。例如,您不能这样做:

String [] reportIds = jsonPath.get("children.flatten().attr.reportId");

int reportId = jsonPath.get("children.flatten().attr.reportId[0]");

这两件事都将抛出ClassCastException。

 类似资料:
  • 我正在尝试向我的应用程序添加一些带有Rest-Asure的测试,但我不知道如何断言一些嵌套值。错误消息是: 预期:(包含“json”的集合)实际:[[json、spring、gulp、path等。]] 代码如下: 这是rest控制器返回的JSON文件: 我不知道如何做出正确的断言,任何帮助都很好。谢谢!

  • null 我正在寻找一个解决方案,如Groovy GPath语法 store.book-此数组的大小。 store.book[*].category-如何计算数组中的键值。 store.bicycle-如果发现它必须返回true值

  • 我正在尝试使用NEST c#客户端搜索我的弹性搜索嵌套对象。我的索引名称是”,我的”字段。 这是我的班级: 现在我的web应用程序看起来像这样: 这里是我需要搜索的单词。 我在浏览器的搜索框(网络表单)中输入它。 搜索关键字可能包含任何需要与我的表人员中的任何字段的值匹配。 如果搜索关键字与嵌套文档匹配,则应返回确切的嵌套文档。 我不知道我的嵌套查询有问题,或者我实际上不知道如何使用嵌套查询来执行

  • 问题内容: 假设我有一个对象: 我想找到一个id为1的对象。是否有类似这样的功能?我可以使用Underscore的方法,但必须从顶部开始然后向下过滤。 问题答案: 递归是您的朋友。我更新了该函数以说明属性数组:

  • 问题内容: 我有一个下面的JSON字符串,我想在JSON字符串中查找/搜索条件。 1)。查找存在的键数。2)。获取给定键的值(如果有数组) 我正在寻找类似Groovy GPath语法的解决方案 store.book-此数组的大小。 store.book [*]。category-如何对数组中存在的键进行计时。 store.bicycle-如果发现它必须返回真实值 问题答案: 您还可以使用REST

  • 我使用的是spring数据,我的DAO看起来像 在上面的代码中,注释行显示了我的意图。spring数据是否可以提供内置功能,使用这样的方法查找所有记录的顺序按某一列与ASC/DESC?