无法从Jenkins Groovy中的json解析的多层地图中删除键

时间:2018-09-06 16:50:12

标签: json jenkins groovy jenkins-pipeline

我有多层地图,就像从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)
}

0 个答案:

没有答案