您需要自己拆分字符串并依次处理每个属性...
尝试:
def root = slurper.Body.createShipmentResponse
if(expectedResponse2 in testElement.tokenize( '.' ).inject( root ) { v, p ->
v?."$p"
}?.collect{ it.text() } ) {
result = "pass"
}
请参阅使用 [] 在 groovy 中访问对象属性
循环遍历列表[ 'integrationFooter', 'errors', 'error', 'errorCode' ]
,从 . 开始slurper.Body.createShipmentResponse
。所以第一次,注入返回slurper.Body.createShipmentResponse.integrationFooter
。然后它调用errors
这个对象,依此类推,直到它得到你可以调用的最终结果collect
。
操作员只是意味着如果?.
它达到空值(并返回空值)它将继续运行
注入说明:
给定这样的对象:
def obj = [ prop1:[ prop2:[ prop3: 'tim' ] ] ]
我们可以调用:
assert obj.prop1.prop2.prop3 == 'tim'
但是,如果我们被赋予属性名称以读取为字符串:
def props = 'prop1.prop2.prop3'
那么这将不起作用(因为没有 key 'prop1.prop2.prop3'
)
assert obj."$props" == 'tim' // FAILS!
但是我们可以props
在句号上拆分以获取属性列表:
def pList = props.tokenize( '.' )
assert pList == [ 'prop1', 'prop2', 'prop3' ]
然后,我们可以处理这个列表,从obj
:
def result = pList.inject( obj ) { currentObject, property ->
// Return the property from the currentObject (or null if currentObject is null)
currentObject?."$property"
}
因此,对于 的每个元素pList
,我们执行以下操作:
Step1:
currentObject == obj
property == 'prop1'
returns obj.prop1 -- [ prop2:[ prop3: 'tim' ] ]
Step2:
currentObject == [ prop2:[ prop3: 'tim' ] ]
property == 'prop2'
returns currentObj.prop2 -- [ prop3: 'tim' ]
Step3 (final step as pList is at an end now):
currentObject == [ prop3: 'tim' ]
property == 'prop3'
returns currentObj.prop3 -- 'tim'
所以最终的结果是'tim'
希望这能解释它:-)