Как создать файл конфигурации 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]
    }
}

ОБНОВИТЬ:

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

Другие вопросы по тегам