Разбор вложенных значений JSON с помощью Lift-JSON - PullRequest
0 голосов
/ 23 мая 2018

Scala 2.12 здесь пытается использовать Lift-JSON для разбора файла конфигурации.У меня есть следующий myapp.json файл конфигурации:

{
  "health" : {
    "checkPeriodSeconds" : 10,
    "metrics" : {
      "stores" : {
        "primary" : "INFLUX_DB",
        "fallback" : "IN_MEMORY"
      }
    }
  }
}

И следующий MyAppConfig класс:

case class MyAppConfig()

Мой myapp.json будет развиваться и потенциально станет очень большим свнутри него много вложенных структур JSON.Я не хочу создать объекты Scala для каждого объекта JSON, а затем вставить это в MyAppConfig следующим образом:

case class Stores(primary : String, fallback : String)
case class Metrics(stores : Stores)
case class Health(checkPeriodSeconds : Int, metrics : Metrics)
case class MyAppConfig(health : Health)

и т. Д.Причина этого в том, что в итоге я получу « config object sprawl » с десятками и десятками классов case, которые существуют только для удовлетворения сериализации из JSON в Scala-land.

Вместо , я хотел бы использовать Lift-JSON для чтения файла конфигурации myapp.json, а затем иметь MyAppConfig просто иметь вспомогательные функции, которые читают / анализируют значения из JSON на лету:

import net.liftweb.json._

// Assume we instantiate MyAppConfig like so:
//
// val json = Source.fromFile(configFilePath)
// val myAppConfig : MyAppConfig = new MyAppConfig(json.mkString)
//
class MyAppConfig(json : String) {
  implicit val formats = DefaultFormats

  def primaryMetricsStore() : String = {
    // Parse "INFLUX_DB" value from health.metrics.stores.primary
  }

  def checkPeriodSeconds() : Int = {
    // Parse 10 value from health.checkPeriodSeconds
  }
}

Таким образом, я могу выбрать, какие конфиги я хочу выставить (сделать читабельными) для моего приложения.Я просто не слежу за документацией по Lift API, чтобы увидеть, как эта стратегия возможна, все они, похоже, хотят, чтобы я занялся созданием множества тематических классов. Есть идеи?

1 Ответ

0 голосов
/ 23 мая 2018

Классы дел не обязательны для извлечения данных из JSON.Вы можете запросить проанализированное дерево и преобразовать данные в соответствии с вашими потребностями.Значения из примера могут быть извлечены следующим образом:

import net.liftweb.json._

class MyAppConfig(json : String) {
  private implicit val formats = DefaultFormats

  private val parsed = parse(json)

  def primaryMetricsStore() : String = {
    (parsed \ "health" \ "metrics" \ "stores" \ "primary").extract[String]
  }

  def checkPeriodSeconds() : Int = {
    (parsed \ "health" \ "checkPeriodSeconds").extract[Int]
  }

}

оригинал документа предоставляет все детали.

...