使用Groovy中的嵌套变量检索映射值

时间:2013-11-18 17:35:02

标签: groovy

我是Groovy的新手,而且一般都是编程的绿色。我正在使用一个POC,它使用Groovy来解析输入中的值,并准备将它们插入到下游的查询中。问题在于,如果需要提取1个值或多个值,则输入结构不同。我找到了一种在接收单个值或接收多个值时生成返回字符串的方法。但是,我正在尝试创建一个可以处理这两种用例的解决方案。 要处理records的多个实例,这可以起作用:

def stringMap =[['Case_Plans__r':['queryLocator':null, 'done':'true', 'records':[['Plan__c':'a0Ic0000002JWCiEAO', 'Id':null, 'type':'Case_Plan__c'], ['Plan__c':'a0Ic0000001qRdtEAE','Id':null, 'type':'Case_Plan__c'], ['Plan__c':'a0Ic0000002JWCnEAO', 'Id':null, 'type':'Case_Plan__c']],'size':3],'Id':'500c0000002AJclAAG', 'type':'Case']]
stringMap=stringMap.Case_Plans__r.records.Plan__c
String returnValue = stringMap[0].collect{"'$it'"}.join(',')
println ("prepared string is $returnValue")

返回预期结果:

prepared string is 'a0Ic0000002JWCiEAO','a0Ic0000001qRdtEAE','a0Ic0000002JWCnEAO'

如果源数据只有records的一个实例,则结构会更改为此,并且我不能使用[0]的索引,或者该值的每个字符将被分割为returnValue:< / p>

def stringMap=[['Case_Plans__r':['queryLocator':null, 'done':'true', 'records':['Plan__c':'a0Ic0000002JWCiEAO', 'Id':null, 'type':'Case_Plan__c'],'size':1],'Id':'500c0000002AJclAAG', 'type':'Case']]
stringMap=stringMap.Case_Plans__r.records.Plan__c
String returnValue = stringMap.collect{"'$it'"}.join(',')
println ("prepared string is $returnValue")

这会返回预期结果, 准备好的字符串是'a0Ic0000002JWCiEAO'

我无法使用findAll收集值或评估records Plan__c的大小以确定要使用的分配。有没有办法收集Plan__c的值,无论它嵌套在哪里?

1 个答案:

答案 0 :(得分:0)

当您获得Plan__c时,您可以展平结果列表:

stringMap=[
  ['Case_Plans__r':
    [
      'queryLocator':null, 
      'done':'true', 
      'records': ['Plan__c':'a0Ic0000002JWCiEAO', 'Id':null, 'type':'Case_Plan__c'],
      'size':1
    ],
    'Id':'500c0000002AJclAAG', 
    'type':'Case'
  ]
]

assert stringMap.Case_Plans__r.records.Plan__c
    .flatten()
    .collect{"'$it'"}
    .join(',') == "'a0Ic0000002JWCiEAO'"

对于多个记录:

stringMap=[
  ['Case_Plans__r':
    [
      'queryLocator':null, 
      'done':'true', 
      'records':[
        ['Plan__c':'a0Ic0000002JWCiEAO', 'Id':null, 'type':'Case_Plan__c'], 
        ['Plan__c':'a0Ic0000001qRdtEAE','Id':null, 'type':'Case_Plan__c'], 
        ['Plan__c':'a0Ic0000002JWCnEAO', 'Id':null, 'type':'Case_Plan__c']
      ],
      'size':3
    ],
    'Id':'500c0000002AJclAAG', 
    'type':'Case'
  ]
]

assert stringMap.Case_Plans__r.records.Plan__c
    .flatten()
    .collect{"'$it'"}
    .join(',') == "'a0Ic0000002JWCiEAO','a0Ic0000001qRdtEAE','a0Ic0000002JWCnEAO'"