Способ глубокого обхода Groovy-объекта с точкой в ​​строке с помощью GPath - PullRequest
4 голосов
/ 07 февраля 2012

Ситуация, с которой я столкнулся, заключается в том, что я запрашиваю MongoDB со строкой для поля, которое находится на глубине более одного уровня в иерархии объектов. Этот запрос должен быть строкой. Так, например, я запрашиваю что-то вроде этого в Groovy:

def queryField = 'a.b.c'  //this is variable and can be different every time
def result = mongodb.collection.findOne([queryField:5])

Не возникает проблема, что в результате я хочу найти значение вложенного поля. С помощью GPath я мог бы пройти один уровень и получить значение a, выполнив это

def aObj = result."a"  //or result["a"]

Однако я хочу пойти глубже, сделав что-то вроде этого:

def queryField = "a.b.c"       //this can change every time and is not always 'a.b.c'
def cObj = result[queryField]  //since field is variable, can't just assume result.a.b.c

Это не работает в Groovy прямо сейчас. Здесь есть ошибка, записанная здесь , но мне было интересно, есть ли лучший способ использовать этот сценарий, который немного чище, чем я, разбирая строку, разбивая ее на точку, а затем создавая обход объекта , Обратите внимание, что «a.b.c» является переменной и неизвестной во время выполнения (например, это может быть «a.b.d»).

1 Ответ

2 голосов
/ 07 февраля 2012

В зависимости от ошибки / потока может возникнуть проблема неоднозначности с поддержкой средства доступа к точечным свойствам.Исходя из потока списка рассылки, может показаться, что оценка строки queryField будет лучшим выбором:

def result = [a: [b: [c: 42]]]
def queryString = 'a.b.c'

def evalResult = Eval.x(result, 'x.' + queryString)
assert evalResult == 42

Скрипт в Groovy Web Console

Поток списка рассылкиявляется немного старым, поэтому существует новый класс Eval (начиная с версии 1.7.2), который может помочь с запуском небольших фрагментов без большой привязки.

В противном случае вы можете разделитьstring и рекурсивно выполняют оценку свойств объекта, эффективно воспроизводя подмножество поведения обхода GPath.

...