使用JSON ARRAY(地图列表)中的特定键值对查找/过滤列表

use*_*153 3 groovy groovyshell groovy-console jenkins-groovy

我有一个JSON数组(地图列表)类似于:

def listOfMap = [[TESTCASE:1, METHOD:'CLICK', RESULT:'PASS'], 
      [TESTCASE:2, METHOD:'CLICK', RESULT:'FAIL'], 
      [TESTCASE:3, METHOD:'CLICK', RESULT:'FAIL'], 
      [TESTCASE:4, METHOD:'TYPETEXT', RESULT:'FAIL']]
Run Code Online (Sandbox Code Playgroud)

1)我想获取/过滤/返回包含键值对" METHOD:CLICK "和" RESULT:FAIL "的所有列表

My output should return 2 lists out of 4: [TESTCASE:2, METHOD:CLICK, RESULT:FAIL], [TESTCASE:3, METHOD:CLICK, RESULT:FAIL]
Run Code Online (Sandbox Code Playgroud)

2)我想获得包含键值对" METHOD:CLICK "和" RESULT:FAIL " 的列表计数

My output should be : 2 
Run Code Online (Sandbox Code Playgroud)

3)从上面的地图列表中,我想获得关键字" METHOD "的所有唯一/不同值

My output should return unique values of the key method : CLICK, TYPETEXT
Run Code Online (Sandbox Code Playgroud)

Szy*_*iak 5

过滤

Groovy有一个调用的方法Collection.findAll(Closure closure),它过滤掉所有不满足谓词的值(表示为闭包):

println listOfMap.findAll { map -> map.METHOD == 'CLICK' && map.RESULT == 'FAIL' }

// Output: [[TESTCASE:2, METHOD:CLICK, RESULT:FAIL], [TESTCASE:3, METHOD:CLICK, RESULT:FAIL]]
Run Code Online (Sandbox Code Playgroud)

数数

还有一种方法DefaultGroovyMethods.count(Iterable<T> self, Closure closure)需要一个谓词并计算有多少元素满足它:

println listOfMap.count { map -> map.METHOD == 'CLICK' && map.RESULT == 'FAIL' }

// Output: 2
Run Code Online (Sandbox Code Playgroud)

地图列表中的唯一值列表

要从地图列表中选择给定键的值,您可以使用Groovy的扩展运算符:

println listOfMap*.METHOD // btw, listOfMap.METHOD will do the same
Run Code Online (Sandbox Code Playgroud)

此代码转换为"为内部的每个元素listOfMap获取键的值METHOD.在下一步中,您可以使用Collection.unique()方法删除所有重复项:

println listOfMap*.METHOD.unique()

// Output: [CLICK, TYPETEXT]
Run Code Online (Sandbox Code Playgroud)

警告:以下方法在Jenkins管道Groovy脚本中不起作用.在这种情况下,您必须Collection.collect(Closure closure)明确使用:

println listOfMap.collect { map -> map.METHOD }.unique()
Run Code Online (Sandbox Code Playgroud)