В Groovy, если ваши строки разделены как таковые, вы можете сделать это:
String myString = "[['one', 'two'], ['three', 'four']]"
List myList = Eval.me(myString)
Однако, если они не разделены, как в вашем примере, я думаю, вам нужно начать играть с оболочкой и пользовательским связыванием ...
class StringToList extends Binding {
def getVariable( String name ) {
name
}
def toList( String list ) {
new GroovyShell( this ).evaluate( list )
}
}
String myString = "[[one, two], [three, four]]"
List myList = new StringToList().toList( myString )
Изменить, чтобы объяснить вещи
Binding в Groovy "Представляет привязки переменных скрипта, которые можно изменить извне объекта скрипта или создать вне скрипта и передать в него."
Итак, здесь мы создаем пользовательскую привязку, которая возвращает имя переменной при запросе переменной (под этим подразумевается установка значения по умолчанию для любой переменной для имени этой переменной).
Мы устанавливаем это как привязку, которую GroovyShell будет использовать для оценки переменных, а затем запускаем строку, представляющую наш список, через оболочку.
Каждый раз, когда оболочка встречает one
, two
и т. Д., Она предполагает, что это имя переменной, и начинает искать значение этой переменной в привязке. Привязка просто возвращает имя переменной и помещается в наш список
Другое редактирование ... Я нашел более короткий путь
Вы можете использовать Карты как связывающие объекты в Groovy, и вы можете использовать закрытие withDefault
для Карт, чтобы при отсутствии ключа результат этого закрытия возвращался как значение по умолчанию для этого ключа. Пример можно найти здесь
Это означает, что мы можем сократить код до:
String myString = "[[one, two], [three, four]]"
Map bindingMap = [:].withDefault { it }
List myList = new GroovyShell( bindingMap as Binding ).evaluate( myString )
Как видите, Карта (благодаря withDefault
) возвращает ключ, который был ей передан, если он отсутствует на Карте.