You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestAssured中提取嵌套JSON数组特定UUID的问题求助

解决RestAssured提取特定条件UUID的问题

嘿,作为RestAssured新手碰到这种复杂的JSON筛选需求确实容易卡壳,我来一步步帮你搞定!根据你的要求,我们需要从给定的JSON数组中提取同时满足两个条件的对象的uuid:

  1. 对象的categories数组中存在name为FUNGI的项
  2. 对象的features数组里,至少有一个子项的features数组包含VRA

核心思路:使用GPath表达式筛选

RestAssured内置了GPath(类似Groovy的路径表达式),可以非常方便地对JSON进行复杂筛选。我们可以用findAll方法遍历数组,结合两个条件来过滤目标对象,最后提取它们的uuid。

完整代码示例

import io.restassured.RestAssured;
import io.restassured.path.json.JsonPath;
import java.util.List;

public class FungiVraUuidExtractor {
    public static void main(String[] args) {
        // 你的示例JSON字符串
        String sampleJson = "[{ \"uuid\":\"e223d29b-499b-b58b-995e-654bef1aab03\", \"categories\":[{ \"uuid\":\"89d1c022-4453-5f6b-883c-46730d429b2a\", \"name\":\"FERTI\" }], \"minRateSi\":0.0 }, { \"uuid\":\"93015a1b-76ac-2ca3-2bbc-5ae5480962c2\", \"categories\":[{ \"uuid\":\"61c951b1-3e47-f0a0-80d8-3d43efa339fb\", \"name\":\"FUNGI\" }], \"minRateSi\":0.0, \"maxRateSi\":7.5E-8, \"features\":[{ \"id\":\"9b4ee6b2-ae2d-6c9a-af77-08a4b749031f\", \"vraMinRate\":2.0E-8, \"features\":[\"VRA\"] }, { \"id\":\"ec0d0f52-dd71-ebb9-0a39-831768fe4490\", \"vraMinRateSi\":3.0E-8, \"features\":[\"VRA\"] }] }, { \"uuid\":\"38290452-4937-4f33-c54d-7f502b84ed99\", \"categories\":[{ \"uuid\":\"2c9d8cc0-01bc-899d-6782-cf412e90fd78\", \"name\":\"FUNGI\" }], \"maxRateSi\":1.0E-7, \"features\":[{ \"id\":\"9b4ee6b2-ae2d-6c9a-af77-08a4b749031f\", \"vraMinRateSi\":6.5E-8 }, { \"cropUuid\":\"ec0d0f52-dd71-ebb9-0a39-831768fe4490\", \"vraMinRateSi\":5.0E-8 }]}]";

        // 解析JSON
        JsonPath jsonPath = JsonPath.from(sampleJson);

        // 编写筛选表达式
        List<String> targetUuids = jsonPath.getList(
            "findAll { " +
                "it.categories.any { cat -> cat.name == 'FUNGI' } && " +
                "it.features.any { feat -> feat.features?.contains('VRA') } " +
            "}.uuid"
        );

        // 输出结果
        System.out.println("符合条件的UUID:");
        targetUuids.forEach(System.out::println);
    }
}

代码解释

  • findAll { ... }:遍历整个JSON数组,只保留满足大括号内条件的对象
  • it.categories.any { cat -> cat.name == 'FUNGI' }:检查当前对象的categories数组中是否存在name为FUNGI的元素,any表示只要有一个匹配就满足条件
  • it.features.any { feat -> feat.features?.contains('VRA') }:检查当前对象的features数组中,是否有至少一个子项的features数组包含VRA。这里的?.是Groovy的安全导航运算符,避免某些对象没有features字段时抛出空指针异常
  • .uuid:最后提取所有筛选出来的对象的uuid属性,得到一个字符串列表

运行结果

执行这段代码后,你会得到唯一符合条件的UUID:

93015a1b-76ac-2ca3-2bbc-5ae5480962c2

在API请求中直接使用

如果是从实际API响应中提取,你可以把这段逻辑整合到RestAssured的请求链里:

List<String> uuids = RestAssured.given()
        .baseUri("你的API基础地址")
        .when()
        .get("/目标接口路径")
        .then()
        .statusCode(200)
        .extract()
        .jsonPath()
        .getList("findAll { it.categories.any { cat -> cat.name == 'FUNGI' } && it.features.any { feat -> feat.features?.contains('VRA') } }.uuid");

内容的提问来源于stack exchange,提问作者harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:47:35