2017-02-09 2 views
2

Я следующий текст JSON и моей целью является найти, если какой-либо из «прямой» поле имеет значение «False» для meta.name = «имя1»разбора JSON с заводной Collect значений

я могу разобрать и получить список для «имя1», но не уверен, как идти дальше .. как собирать значения поля «прямой»! = истинным и проверить, если коллекция больше чем 0.

def list = new groovy.json.JsonSlurper().parseText(text) 
println list.record.land.find{ it.meta.name == 'name1' } 



{ 
    "version": 1, 
    "record": { 
    "land": [ 
     { 
     "meta": { 
      "name": "name1", 
      "type": "person" 
     }, 
     "delete": { 
      "result": "allow", 
      "factor": { 
      "direct": true, 
      "rules": [ 
       { 
       "rule1": "1002", 
       "uri": "/deeds/567576-ffgt-1002" 
       }, 
       { 
       "rule1": "5012", 
       "uri": "/deeds/567576-dfge-5012" 
       } 
      ] 
      } 
     }, 
     "transfer": { 
      "result": "allow", 
      "factor": { 
      "direct": true, 
      "rules": [ 
       { 
       "rule1": "1002", 
       "uri": "/deeds/567576-ffgt-1002" 
       }, 
       { 
       "rule1": "5012", 
       "uri": "/deeds/567576-dfge-5012" 
       } 
      ] 
      } 
     }, 
     "move": { 
      "result": "allow", 
      "factor": { 
      "direct": false, 
      "rules": [ 
       { 
       "rule1": "1002", 
       "uri": "/deeds/567576-ffgt-1002" 
       }, 
       { 
       "rule1": "5012", 
       "uri": "/deeds/567576-dfge-5012" 
       } 
      ] 
      } 
     } 

    } 
    ] 
} 
} 

ответ

1

в первом шаге вы можете фильтровать JSON, чтобы найти все объекты с указанием вида:

def filtered = list.record.land.findAll{ it.meta.name == 'name1'} 

Тогда вы могли бы что-то вроде этого:

def directIsFalse = ['delete', 'transfer', 'move'].any{ 
    filtered[it].factor.direct[0] == false; 
} 

Это возвращает истину, если, по крайней мере, один раздел («удалить», «передача» или «перемещение») поле прямой будет равен false.

+0

Спасибо за быстрый ответ. – user3741611

+1

мы можем сделать больше работы в закрытии findAll: 'def hasFalseDirect = list.record.land.findAll {it.meta.name ==" name1 "&& it.find {item -> item.value.factor ?. direct == false}} ' –

+0

Если ключи в« отфильтрованном »списке являются динамическими (я имею в виду, может быть любая строка .. не предопределена, как« удалить »,« обновить »и т. д.), есть ли способ проверить все? – user3741611

Смежные вопросы