将字符串添加到Groovy中的List以迭代throws没有这样的属性:a for class:java.lang.String

时间:2017-03-25 18:16:50

标签: groovy

我有字符串,它以用户的输入形式出现。我将String添加到一个空的groovy列表中。新列表可以打印出所需的新内容。但是当我尝试迭代新的List时,它会发出错误:

groovy.lang.MissingPropertyException: No such property: a for class: java.lang.String

我在groovyConsole中的测试如下:

def obj ="[a: 'files', b: 'filename', folder: [src: 'dir1', tgt: 'dir2']],[a: 'files2', b: 'filename2', folder: [src: 'dir3', tgt: 'dir4']]"

println obj.class.name //returns java.lang.String
//The empty List initialised
def l = []
println l.class.name
//Adds the string to the List l
l << obj
println l.class.name  //returns java.util.ArrayList as expected
//trying to iterate over the List l, as so throws the exception "No such property: a for class: java.lang.String"
l.each { k -> 
    println k.a
    println k.folder.src
}

注意:println l,返回以下

[[a: 'files', b: 'filename', folder: [src: 'dir1', tgt: 'dir2']],[a: 'files2', b: 'filename2', folder: [src: 'dir3', tgt: 'dir4']]]

1 个答案:

答案 0 :(得分:2)

它不会以这种方式工作。您无法引用String,就好像它是Map或其他具有属性a的对象。您需要做的是将obj定义为Map或将其定义为String,并使用Eval进行评估以进行进一步处理。以下两个例子都有:

def obj = Eval.me("[[a: 'files', b: 'filename', folder: [src: 'dir1', tgt: 'dir2']],[a: 'files2', b: 'filename2', folder: [src: 'dir3', tgt: 'dir4']]]")

def l = []
l << obj

l.each { k -> 
    println k.a
    println k.folder.src
}

obj = [[a: 'files', b: 'filename', folder: [src: 'dir1', tgt: 'dir2']],[a: 'files2', b: 'filename2', folder: [src: 'dir3', tgt: 'dir4']]]
l.removeAll()
l << obj

l.each { k -> 
    println k.a
    println k.folder.src
}