在groovy中从键创建嵌套映射

时间:2016-07-15 12:55:14

标签: dictionary gradle groovy

我对groovy相对较新,并且在gradle构建的上下文中使用它。如果有一个简单易用的解决方案,请不要苛刻。

基本上我试图完成Return Nested Key in Groovy的逆转。也就是说,我从System.properties地图中读取了一些键,例如user.home和相应的值,例如C:\User\dpr。现在我想创建一个反映此结构的地图,以便在groovy.text.SimpleTemplateEngine作为绑定使用它:

[user : [home : 'C:\Users\dpr']]

键可以定义任意深层次结构。例如java.vm.specification.vendor=Oracle Corporation应该成为:

[java : [vm : [spec : [vendor : 'Oracle Corporation']]]]

此外,还有一些属性与父母相同,例如user.name=dpruser.country=US

[
   user: [
     name: 'dpr',
     country: 'US'
  ]
]

编辑:虽然ConfigSlurper非常好,但在创建嵌套地图时有点过于防御,因为它会停止在某个键的最小深度处嵌套。

我目前最终使用此

def bindings = [:]
System.properties.sort().each {
  def map = bindings
  def split = it.key.split("\\.")
  for (int i = 0; i < split.length; i++) {
    def part = split[i];

    // There is already a property value with the same parent
    if (!(map instanceof Map)) {
      println "Skipping property ${it.key}"
      break;
    }

    if (!map.containsKey(part)) {
      map[part] = [:]
    }

    if (i == split.length - 1) {
      map[part] = it.value
    } else {
      map = map[part]
    }
  }
  map = it.value
}

使用此解决方案,属性file.encoding.pkgjava.vendor.urljava.vendor.url.bug将被丢弃,这不是很好,但我可以应对。

但是上面的代码并不是非常狂野。

1 个答案:

答案 0 :(得分:3)

您可以使用ConfigSlurper

def conf = new ConfigSlurper().parse(System.properties)
println conf.java.specification.version