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



如何将任意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]
    }
}

更新:

  • 重新占用这篇文章,明确要求一个动态/通用的解决方案。
  • 这使得它成为一个独特的问题,不像下面的假设在初始化状态下有一个已知的映射:如何在Grails中只使用嵌套映射创建ConfigObject ?

如果您事先知道嵌套的Map结构,您的解决方案将有效。如果您需要在未知的任意嵌套Map结构上执行此操作,请尝试这样做:

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]
    }
}

只需将每个Map转换为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中仅使用嵌套映射创建ConfigObject ?

(我只是想让人们知道你可以在Grails之外做到这一点,最初我没有意识到如何调用漂亮的打印。我混淆了JsonOutput.prettyPrint())

由于@Steinar

最新更新