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

Rest Assured从嵌套列表提取元素:获取每个human列表的首个姓名

解决JSON提取每个human列表第一个姓名的问题

首先咱们先理清楚你的JSON结构,这样能更容易找到问题所在:

{ 
  "type" : "employee", 
  "columns" : [ 
    { 
      "id" : 1, 
      "human" : [ 
        { "name" : "ANA", "age" : "23" }, 
        { "name" : "IULIA", "age" : "22" } 
      ] 
    }, 
    { 
      "id" : 2, 
      "human" : [ 
        { "name" : "ADI", "age" : "21" }, 
        { "name" : "GELU", "age" : "18" } 
      ] 
    } 
  ] 
}

你之前用的body("columns.human.name[0]", everyItem(containsString("A")))之所以没生效,问题出在JSONPath路径的写法错误:

  • columns.human.name会把所有columns元素里的human数组中的所有name字段都提取出来,形成一个扁平化的数组:["ANA", "IULIA", "ADI", "GELU"]
  • 然后加[0]就只会取这个大数组的第一个元素"ANA",everyItem()作用在单个字符串上自然不符合预期。

正确的写法

要提取每个columns元素下human列表的第一个姓名,你需要调整JSONPath路径,让它定位到每个human数组的第一个元素的name字段:

方法1:针对RestAssured的写法

.body("columns.human[0].name", everyItem(containsString("A")))

这里的逻辑是:columns是数组,everyItem()会遍历columns的每个元素,然后对每个元素取human[0].name,也就是每个human列表的第一个姓名,再验证这些姓名都包含"A"。

方法2:更明确的JSONPath写法

如果需要更清晰的路径,可以用通配符*遍历columns数组的每个元素:

.body("columns.*.human[0].name", everyItem(containsString("A")))

这个路径columns.*.human[0].name会直接返回目标数组["ANA", "ADI"],everyItem()就会正确遍历这两个元素进行验证。

验证一下

你可以用JSONPath测试工具验证路径的结果:

  • 输入columns[*].human[0].name,返回的结果正好是["ANA", "ADI"],这就是你需要的每个human列表的第一个姓名。

这样调整后,你的断言就能正常生效啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:45:17