使用GStrings可以访问对象的属性,包括嵌套属性。但是如何访问list属性中的第n个元素?
class Foo {
List<Bar> elements
}
class Bar {
String version
}
我需要使用GString访问Foo.elements对象中的版本属性以获取特定索引。 在代码下面尝试没有成功。
def property = "elements[0].version"
fooObject."$property" fails to identify the property
答案 0 :(得分:4)
因此,根据允许的灵活性,我认为有三种方法可以解决这个问题
class Foo {
List<Bar> elements
}
class Bar {
String version
}
假设fooObject
是Foo
的对象,例如:
def fooObject = new Foo(elements:[new Bar(version:1), new Bar(version:2)])
如果您可以:
println fooObject."elements"[1]."version"
否则,将所有内容放入字符串中,然后进行插值:
println "${fooObject.elements[1].version}"
最终,如果以上两种情况都不适合你:
def property='elements[1].version'
def expr = 'fooObject.' + property
println Eval.me('fooObject', fooObject, expr)
最后一个将fooObject
作为fooObject
提供给正在评估的表达式并计算表达式。
答案 1 :(得分:1)
理想情况下,它可能是:
def prop1 = "elements"
def prop2 = "version"
fooObject."$prop1"[0]."$prop2"
冗长且通用的将使用inject
:
class Foo {
List<Bar> elements
}
class Bar {
String version
}
def fooObject = new Foo(elements: [new Bar(version: '1'),
new Bar(version: '2'),
new Bar(version: '3')])
def fetchVersion(property, fooObject) {
property.tokenize(/./).inject(fooObject) {obj, elem ->
if(elem.contains(/[/)){
def var = elem.tokenize(/[]/)
obj?."${var[0]}".getAt("${var[1]}".toInteger())
} else {
obj?."$elem"
}
}
}
assert fetchVersion("elements[0].version", fooObject) == '1'
assert fetchVersion("elements[1].version", fooObject) == '2'
assert fetchVersion("elements[2].version", fooObject) == '3'
assert fetchVersion("elements[7].version", fooObject) == null