2016-09-14 5 views
-1

Как преобразовать произвольный список/список Groovy в синтаксис DSL стиля конфигурации, который предоставляет 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] 
    } 
} 

UPDATE:

  • Re-присваивая этот пост явно задать для динамического/обобщенного решения ,
  • Это делает его уникальным вопрос, и в отличие от следующего, который предполагает известную карту на ее инициализации состояния: How to create ConfigObject using only nested maps in Grails?

ответ

1

Если вы знаете, вложенную структуру карты заранее, ваше решение будет работать. Если вам нужно сделать это на неизвестной произвольной вложенную структуру карт, попробовать что-то вроде этого:

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

Ничего себе! Я повторно присвоил сообщение, чтобы явно предложить динамическое решение. Круто!! –

0

Просто конвертировать каждую карту в 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 и первоначально я не реальный ize, как была вызвана симпатичная печать. Я был смущен с JsonOutput.prettyPrint())

Благодарности @Steinar

 Смежные вопросы

  • Нет связанных вопросов^_^