Как создать файл конфигурации DSL Groovy, используя произвольную карту (динамический объект)
Как преобразовать произвольную карту / список Groovy в синтаксис DSL стиля конфигурации, предоставляемый Groovy?
Пример:
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, используя только вложенные карты в Grails?
2 ответа
Если вы заранее знаете структуру вложенных карт, ваше решение будет работать. Если вам нужно сделать это на неизвестной произвольной вложенной структуре Map, попробуйте что-то вроде этого:
import groovy.util.ConfigObject
def mapToConfig
mapToConfig = { Map map ->
map.collectEntries { k, v ->
v instanceof Map ? [(k):mapToConfig(v)] : [(k):v]
} as ConfigObject
}
Учитывая ваш ввод и приведенное выше определение замыкания, следующий оператор print:
println mapToConfig(config).prettyPrint()
Дает этот вывод:
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()
Вся заслуга: как создать ConfigObject, используя только вложенные карты в Grails?
(Я просто хотел, чтобы люди знали, что вы можете сделать это вне Grails, и изначально я не понимал, как вызывается симпатичная печать. Я был перепутан с JsonOutput.prettyPrint())
Спасибо @Steinar