如何使用任意映射(动态对象)创建 DSL Groovy 配置文件
How to create a DSL Groovy config file using an arbitrary Map (dynamic object)
如何将任意 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]
}
}
更新:
- 重新分配此 post 以明确要求 dynamic/generalized 解决方案。
- 这使它成为一个独特的问题,与以下假设在其初始化状态下已知地图的问题不同:How to create ConfigObject using only nested maps in Grails?
只需将每个 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()
所有功劳归于: How to create ConfigObject using only nested maps in Grails?
(我只是想让人们知道您可以在 Grails 之外执行此操作,最初我没有意识到如何调用漂亮的打印。我对 JsonOutput.prettyPrint() 感到困惑)
感谢@Steinar
如果您事先知道嵌套的 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]
}
}
如何将任意 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]
}
}
更新:
- 重新分配此 post 以明确要求 dynamic/generalized 解决方案。
- 这使它成为一个独特的问题,与以下假设在其初始化状态下已知地图的问题不同:How to create ConfigObject using only nested maps in Grails?
只需将每个 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()
所有功劳归于: How to create ConfigObject using only nested maps in Grails?
(我只是想让人们知道您可以在 Grails 之外执行此操作,最初我没有意识到如何调用漂亮的打印。我对 JsonOutput.prettyPrint() 感到困惑)
感谢@Steinar
如果您事先知道嵌套的 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]
}
}