Как я могу динамически генерировать типобезопасный файл конфигурации (Hocon) в Scala (создать файл конфигурации)
Я хочу генерировать конфигурацию Hocon динамически.
Картаввода и
выходной файл с содержанием ниже
block{
key1 : value
key2 : value
}
Trying to read map
var myMap = new util.HashMap[String,AnyRef]()
val myConfig = ConfigFactory.parseMap(myMap)
myConfig.toString print below
Config(SimpleConfigObject({"key":"value"}))
не в состоянии понять, как извлечь из него конф
Я попробовал ниже вариант, но он печатает в формате JSON
val finalConfig : String =
myConfig.root().render( ConfigRenderOptions.defaults())
println(finalConfig)
Любой другой подход для генерации conf, чтобы можно было поддерживать вложенную структуру?
Редактировать: найденное решение Вложенную конфигурацию можно создать с помощью ConfigFactory.withValue https://marcinkubala.wordpress.com/2013/10/09/typesafe-config-hocon/
2 ответа
Я не уверен, хорошо ли я понимаю вашу проблему...
Но мне кажется, что вам нужно только отформатировать Map
как HOCON- подобный String
,
Который вы можете позже записать в файл.
Надеюсь, этот фрагмент кода - то, что вы ищете:
import collection.JavaConverters._
def toHocon(map: java.util.Map[String, AnyRef]): String =
map
.asScala
.map { case (key, value) => s"$key : $value" }
.mkString("block{\n\t", "\n\t", "\n}")
(Я использовал один символ табуляции для отступа, вы можете заменить его на несколько вкладок или с фиксированным количеством пробелов).
Вы можете использовать kxbmap / configs
Это поддерживает play-json
из коробки. Я использую его для сопоставления целых конфигураций напрямую case classes
,
Итак, ваш пример будет выглядеть так:
import com.typesafe.config.ConfigFactory
import configs.Configs
val config = ConfigFactory.parseString("""
block{
key1 : value
key2 : value
}
""")
config.get[Map[String, String]("block")
Вы можете попробовать следующее:
myConfig.root().render(com.typesafe.config.ConfigRenderOptions.concise())