Grails 如何使用任意映射(动态对象)创建DSL Groovy配置文件

Grails 如何使用任意映射(动态对象)创建DSL Groovy配置文件,grails,groovy,dsl,spring-dsl,groovydsl,Grails,Groovy,Dsl,Spring Dsl,Groovydsl,如何将任意Groovy映射/列表转换为Groovy提供的配置风格DSL语法? 例如: def config = [ 'test': 'lalala', 'nestedObject': [ foo1: 'foo1 val', foo2: 'foo2 val', nested2: [ anInt: 5, anArray: ['a', 'b', 'c'], anInt

如何将任意Groovy映射/列表转换为Groovy提供的配置风格DSL语法?

例如:

def config = [
    'test': 'lalala',
    'nestedObject': [
        foo1: 'foo1 val',
        foo2: 'foo2 val',
        nested2: [
            anInt: 5,
            anArray: ['a', 'b', 'c'],
            anIntArray: [1, 2, 3]
        ]
    ]
]
例如:

test = 'lalala'
nestedObject {
    foo1 = 'foo1 val'
    foo2 = 'foo2 val'
    nested2 {
        anInt = 5
        anArray = ['a', 'b', 'c']
        anIntArray = [1, 2, 3]
    }
}

更新:

  • 重新分配此职位,明确要求提供动态/通用解决方案
  • 这使其成为一个独特的问题,与以下假设在其初始化状态下存在已知映射不同:

只需将每个地图转换为一个ConfigObject,然后漂亮地打印它:

import groovy.util.ConfigObject

def config = [
    'test': 'lalala',
    'nestedObject': [
        foo1: 'foo1 val',
        foo2: 'foo2 val',
        nested2: [
            anInt: 5,
            anArray: ['a', 'b', 'c'],
            anIntArray: [1, 2, 3]
        ] as ConfigObject
    ] as ConfigObject
] as ConfigObject

println config.prettyPrint()
所有功劳归于:

(我只是想让人们知道,您可以在Grails之外执行此操作,但最初我没有意识到如何调用pretty printing。我被JsonOutput.prettyPrint()弄糊涂了。)


谢谢@Steinar

如果您事先知道嵌套的映射结构,您的解决方案将起作用。如果需要在未知的任意嵌套映射结构上执行此操作,请尝试以下操作:

import groovy.util.ConfigObject

def mapToConfig
mapToConfig = { Map map ->
    map.collectEntries { k, v ->
        v instanceof Map ? [(k):mapToConfig(v)] : [(k):v]
    } as ConfigObject
}
根据您的输入和上述闭包定义,以下打印语句:

println mapToConfig(config).prettyPrint()
产生以下输出:

test='lalala'
nestedObject {
    foo1='foo1 val'
    foo2='foo2 val'
    nested2 {
        anInt=5
        anArray=['a', 'b', 'c']
        anIntArray=[1, 2, 3]
    }
}

哇!我重新分配了这个职位,明确要求一个动态的解决方案。凉的