Groovy中如何遍历嵌套对象提取指定name对应的matrix_value?
Groovy递归提取嵌套对象的matrix_value
需求说明
我在Groovy中拥有一个嵌套结构的对象列表,需要根据指定的name值,匹配顶层对象或其子对象(children字段中的元素),并提取对应的matrix_value。当前代码仅能检索顶层对象的matrix_value,需修改以支持递归查找嵌套的子对象。
对象结构示例
[{"id":null,"dimension":"f7f04751-5ac9-4867-a742-6f69a53d99d3","matrix_value":"ac726cd4-0aaf-4b4b-91c1-bceda8dded04","name":"Linear","include":false,"children":[{"id":null,"dimension":"f7f04751-5ac9-4867-a742-6f69a53d99d3","matrix_value":"efc05bdb-ebc8-4167-85fb-9e5a63a1200b","name":"Little Linear","include":false,"children":[]}]},{"id":null,"dimension":"f7f04751-5ac9-4867-a742-6f69a53d99d3","matrix_value":"a2b932d3-14f0-480f-8eeb-d1fc00a1c7ab","name":"Not Linear","include":false,"children":[]}]
原代码(仅支持顶层查找)
import groovy.json.JsonSlurper; def Dimensions = vars.getObject("Dimensions") String[] DimensionKeyset = vars.getObject("DimensionKeySet"); String Dimension_name = DimensionKeyset[Integer.parseInt(vars.get("ContoDimensions"))] String[] Values = Dimensions.get(Dimension_name) def Body = vars.get("Body_Get") def jsonSlurper = new JsonSlurper(); def list = jsonSlurper.parseText(Body); def rc_dimension_values = [] log.info("La lista è: "+ list.toString()) log.info("La vera lista è: "+ list.getClass()) for(v : Values) { rc_dimension_values += list.find { it.name.trim() == v.trim() }.matrix_value log.info("L'oggetto è:" + list.find { it.name.trim() == v.trim() } ) log.info("Check For Values: " + v) } def builder = new groovy.json.JsonBuilder(rc_dimension_values) vars.put("rc_dimension_values", builder.toString());
修改后的代码(支持递归查找)
核心是添加递归函数,遍历顶层对象及其所有子对象,找到匹配name的元素并返回对应的matrix_value:
import groovy.json.JsonSlurper; def Dimensions = vars.getObject("Dimensions") String[] DimensionKeyset = vars.getObject("DimensionKeySet"); String Dimension_name = DimensionKeyset[Integer.parseInt(vars.get("ContoDimensions"))] String[] Values = Dimensions.get(Dimension_name) def Body = vars.get("Body_Get") def jsonSlurper = new JsonSlurper(); def list = jsonSlurper.parseText(Body); def rc_dimension_values = [] // 递归查找函数:遍历对象列表及所有子对象,匹配目标name并返回对应的matrix_value def findMatrixValueByName(items, targetName) { for (item in items) { // 匹配当前对象的name if (item.name.trim() == targetName.trim()) { return item.matrix_value } // 若有非空子对象,递归查找 if (item.children && !item.children.isEmpty()) { def childResult = findMatrixValueByName(item.children, targetName) if (childResult) { return childResult } } } return null // 未找到时返回null } log.info("La lista è: "+ list.toString()) log.info("La vera lista è: "+ list.getClass()) for(v : Values) { def foundValue = findMatrixValueByName(list, v) if (foundValue) { rc_dimension_values.add(foundValue) log.info("找到匹配值: " + foundValue + " 对应name: " + v) } else { log.info("未找到匹配name: " + v) } } def builder = new groovy.json.JsonBuilder(rc_dimension_values) vars.put("rc_dimension_values", builder.toString());
关键修改点
- 新增
findMatrixValueByName递归函数,覆盖顶层对象和所有嵌套子对象的查找 - 优先检查当前对象的
name是否匹配,匹配则直接返回对应的matrix_value - 若当前对象存在非空
children,则递归调用函数查找子对象 - 循环中调用递归函数替代原有的
list.find,确保能处理所有嵌套层级
内容的提问来源于stack exchange,提问作者Michele Scianatico
相关产品推荐
相关产品推荐

