Не удалось удалить ключи из многоуровневой карты, проанализированной в json, в Jenkins groovy - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть многоуровневая карта, например, которая читается из файла Json:

def someMap = parseJson( readFile(file:'someJson.json'))

/* below is the actual map from someJson.json
someMap = [gen:[type:all], 
           build:[time:6, 
                  types:[
                    TypeA:[type1:[a:true, b:false, c:true, d:true, e:true], 
                          type2:[a:true, b:false, c:true, d:true, e:true]], 
                    TypeB:[type1:[a:true, b:false, c:true, d:true, e:true]
                          type2:[a:true, b:false, c:true, d:true, e:true]], 
                    TypeC:[type1:[a:true, b:false, c:true, d:true, e:true],
                          type2:[a:true, b:false, c:true, d:true, e:true]]]]

  */

  @NonCPS
  def parseJson(txt){
    def lazyMap = new groovy.json.JsonSlurper().parseText(txt)
    def map = [:]
    for ( prop in lazyMap ) {
       map[prop.key] = prop.value
    }
   return map;
  }

Я хочу удалить из него некоторые записи, скажем «TypeA» и «TypeB» из карты , но с помощью скрипта Jenkins groovy я не могу этого сделать , с обычным groovy я могу удалить записи с помощью removeAll () или итератора, ниже уже пробовал.

someMap.build.types.keySet().removeAll(['TypeA', 'TypeB', 'TypeC'].minus('TypeC')))
--------------
def iterator = someMap.build.types.entrySet().iterator()
while (iterator.hasNext()) {
  if (iterator.next().key != 'TypeC' ) {
    iterator.remove()
  }
}
--------------
def lst=['TypeA','TypeB']
lst.each{
   someMap.build.types.remove(it)
}

но я получаю исходную карту без элементов.

меня пугает то, что если я вручную создаю ту же карту и пытаюсь выполнить операцию, она работает нормально.

def mp2 = ['gen':['type':'all'], 
         'build':['types':[
                   'TypeA':['type1':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true'],
                            'type2':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true']], 
                   'TypeB':['type1':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true'], 
                            'type2':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true']],
                   'TypeC':['type1':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true'], 
                            'type2':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true']]]]]
def lst=['TypeA','TypeB']
lst.each{
  mp2.build.types.remove(it)
}
...