Dictionary 从groovy中的键创建嵌套映射

Dictionary 从groovy中的键创建嵌套映射,dictionary,gradle,groovy,Dictionary,Gradle,Groovy,我对groovy比较陌生,并且正在gradle构建的上下文中使用它。因此,如果有一个简单的开箱即用的解决方案,请不要苛刻 基本上,我正试图实现相反的目标。也就是说,我从System.properties映射中读取了一些键,例如user.home和相应的值,如C:\user\dpr。现在,我想创建一个反映此结构的映射,以便在groovy.text.SimpleTemplateEngine中作为绑定使用它: [user : [home : 'C:\Users\dpr']] 这些键可以定义任意的深层

我对groovy比较陌生,并且正在gradle构建的上下文中使用它。因此,如果有一个简单的开箱即用的解决方案,请不要苛刻

基本上,我正试图实现相反的目标。也就是说,我从
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=dpr
user.country=US

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

Edit:虽然
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
}
def绑定=[:]
System.properties.sort()。每个{
def map=绑定
def split=it.key.split(“\\”)
对于(int i=0;i
使用此解决方案,属性
file.encoding.pkg
java.vendor.url
java.vendor.url.bug
被丢弃,这并不好,但我可以处理

但是,上面的代码不太符合Groovy标准。

您可以使用:


这似乎只在一定程度上适用于某些属性,而正确的结构是为其他属性创建的,而不是:
[java:[runtime.name:java(TM)SE Runtime Environment,Runtime.version:1.8.0_92-b14,…
我认为这可能与某个属性路径的最小深度有关。存在
java.home
,因此它直接在
java
键下创建所有
java.
项,而无需进一步嵌套。是的,如果a.b有一个值,那么它就不能作为映射,它不能有嵌套值。在这种情况下,ConfigSlurper使用具有.inside的键创建嵌套值。例如,
java.vendor
是字符串,因此您必须使用
java['vendor.url']访问嵌套值
我刚刚注意到,对于
java.vendor
java.vendor.url
java.vendor.url.bug
和其他可能的属性,不可能创建相应的映射。但是
ConfigSlurper
似乎有点过于保守。它可以为
java.vm.
属性创建映射没有属性
java.vm
。但它没有
def conf = new ConfigSlurper().parse(System.properties)
println conf.java.specification.version