В этом примере вы имеете дело с сокращенной версией оператора распространения Groovy , и ваш код возвращает верный результат.Когда вы звоните jsl.locations
, вы фактически получаете доступ к списку всех объектов местоположений (в вашем примере это одноэлементный список).Когда вы звоните
jsl.locations.modes
, вы используете сокращенную версию
jsl.locations*.modes
, которая эквивалентна следующему коду:
jsl.locations.collect { it.modes }
Этот код означает: итерацияlocations
и преобразование списка местоположений в список списков режимов этих местоположений - [[1,5,11]]
.
Применение правильного решения зависит от еще нескольких факторов.Например, вам нужно рассмотреть список locations
, содержащий несколько местоположений - в этом случае преобразование jsl.locations.modes
может дать результат, подобный [[1,5,11],[1,5,11],[2,4,9]]
- список из трех списков режимов.
Если вы предполагаете, что всегда возвращается единственное местоположение, то вы можете просто сгладить окончательный список, например:
def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11]
assert modes.size() == 3
Однако, если locations
содержит другой объект JSON, скажем,с точно такими же режимами, тогда он даст совершенно другой результат:
def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11,1,5,11]
assert modes.size() == 6
В этом случае может быть лучше использовать утверждения типа:
def modes = jsl.locations.modes
assert modes == [[1,5,11],[1,5,11]]
assert modes*.size() == [3,3]
, что означает:
modes
хранит 2 списка [1,5,11]
и [1,5,11]
, - , размер первого списка равен 3, а размер второго списка также равен 3.