Как я могу динамически генерировать файл конфигурации typesafe (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"}))

не могу понять как вытащить из него conf

Я попробовал вариант ниже, но он печатается в формате JSON.

val finalConfig : String =
      myConfig.root().render( ConfigRenderOptions.defaults())
println(finalConfig)

Любой другой подход к созданию conf, чтобы можно было поддерживать вложенную структуру?

Изменить: найденное решение. Вложенную конфигурацию можно создать с помощью ConfigFactory.withValue https://marcinkubala.wordpress.com/2013/10/09/typesafe-config-hocon/


person user2895589    schedule 12.02.2019    source источник


Ответы (3)


Я не уверен, что хорошо понимаю вашу проблему...

Но мне кажется, что вам нужно только отформатировать свой 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}")

(я использовал один символ табуляции для отступа, вы можете заменить его другими табуляциями или фиксированным количеством пробелов).

person Luis Miguel Mejía Suárez    schedule 12.02.2019
comment
Мне нравится это решение, но оно может не поддерживать создание вложенных Hocon. Любые входные данные, если я хочу создать вложенный json в scala, например p1{key: value, c1{key1: value1}} - person user2895589; 13.02.2019
comment
@ user2895589 Спасибо, что приняли мой ответ, но я действительно не ответил на ваш вопрос. Вы должны добавить свой собственный ответ и принять его вместо этого. - person Luis Miguel Mejía Suárez; 13.02.2019

Вы можете использовать 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")
person pme    schedule 12.02.2019
comment
Привет @pme, я ввел карту, и я хочу распечатать файл конфигурации. Я хочу создать файл конфигурации - person user2895589; 12.02.2019
comment
о, извините - я только вчера использовал эту библиотеку - так что я был слишком увлечен ею;) - person pme; 13.02.2019

Вы можете попробовать ниже:

    myConfig.root().render(com.typesafe.config.ConfigRenderOptions.concise())
person Manish    schedule 25.11.2019