Groovy用JsonSlurper解析Elasticsearch JSON的数据提取需求
优化后的Groovy解析方案
核心实现代码
import groovy.json.JsonSlurper def jsonSlurper = new JsonSlurper() def esResponse = jsonSlurper.parseText(yourEsHttpResponseText) // 提取目标数据 def targetBits = esResponse.hits.hits._source.providers.flatten() .findAll { provider -> // 过滤掉UniqueId带_1/_2这类数字后缀的项 !provider.UniqueId.matches(/.*_\d+$/) } .collect { [mostSigBits: it.mostSigBits, leastSigBits: it.leastSigBits] }
代码细节说明
- 扁平化嵌套结构:用
flatten()处理多层嵌套的_source.providers,一次性遍历所有hit下的providers数组,避免多层循环嵌套。 - 精准后缀过滤:通过正则
/.*_\d+$/直接匹配_加数字的后缀,比字符串分割、截取的方式更高效且逻辑清晰。 - 链式风格简化:将过滤、数据收集操作串联起来,符合Groovy脚本的简洁特性,可读性和维护性更强。
扩展场景处理
如果需要对UniqueId做去重(避免不同hit中出现重复UniqueId的项),可以在过滤前加入去重逻辑:
def targetBits = esResponse.hits.hits._source.providers.flatten() .unique { it.UniqueId } // 按UniqueId去重 .findAll { !it.UniqueId.matches(/.*_\d+$/) } .collect { [mostSigBits: it.mostSigBits, leastSigBits: it.leastSigBits] }
兼容初始需求(提取所有_id)
如果后续仍需用到最初提取所有_id的需求,可采用简洁的链式写法:
def allIds = esResponse.hits.hits*.id // 若字段是_id则改为it._id,根据实际返回结构调整
内容的提问来源于stack exchange,提问作者deewreck
相关产品推荐
相关产品推荐

