groovy - 从 JSON ARRAY(映射列表)中查找/过滤具有特定键值对的列表

标签 groovy groovyshell groovy-console jenkins-groovy

我有一个类似于以下内容的 JSON 数组( map 列表):

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']]

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]

2) 我想获取包含键值对“METHOD:CLICK”和“RESULT:FAIL”的列表的计数>”

My output should be : 2 

3)从上面的 map 列表中,我想获取键“METHOD”的所有唯一/不同值

My output should return unique values of the key method : CLICK, TYPETEXT

最佳答案

过滤

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]]

计数

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

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

// Output: 2

map 列表中的唯一值列表

要从映射列表中为给定键选择值,您可以使用 Groovy's spread operator :

println listOfMap*.METHOD // btw, listOfMap.METHOD will do the same

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

println listOfMap*.METHOD.unique()

// Output: [CLICK, TYPETEXT]

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

println listOfMap.collect { map -> map.METHOD }.unique()

关于groovy - 从 JSON ARRAY(映射列表)中查找/过滤具有特定键值对的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48434901/

相关文章:

spring - 一个组件需要一个名为 '' 的 bean,但是找不到

groovy - 如何在 Groovy 中将进程的 stdout、stderr 和 stdin 重定向到文件或从文件重定向,就像在 Bash shell 中一样?

parsing - groovy如何区分字符串的除法?

java - 我如何说服 GroovyShell 通过 eval() 调用维护状态?

groovy - 使用 Groovy Console,是否可以在类路径中重新加载更改的文件?

eclipse - 如何设置STS/Eclipse的源路径(使用Groovy grails)并使之固定?

grails - 无法从Config.groovy访问外部化的grails.serverURL

Groovy 中的 Unix FIND 命令

grails - 对grails的 Ant 调用因 “[exec] Application is pre-Grails 0.5, please run: grails upgrade”而失败

java - GroovyShell:嵌入式执行