使用 Lift-JSON 解析嵌套的 JSON 值
Parsing nested JSON values with Lift-JSON
Scala 2.12 在这里尝试使用 Lift-JSON 来解析配置文件。我有以下 myapp.json
配置文件:
{
"health" : {
"checkPeriodSeconds" : 10,
"metrics" : {
"stores" : {
"primary" : "INFLUX_DB",
"fallback" : "IN_MEMORY"
}
}
}
}
以及以下MyAppConfig
class:
case class MyAppConfig()
我的 myapp.json
将进化并可能变得非常大,其中包含许多嵌套的 JSON 结构。我 不想 必须为每个 JSON 对象创建 Scala 对象,然后像这样在 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”,其中有几十个案例 classes,它们的存在只是为了满足 [=45] 的序列化=] 进入 Scala 世界。
而不是,我想使用 Lift-JSON 来读取 myapp.json
配置文件,然后 MyAppConfig
具有 read/parse 值 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 文档来了解这种策略是如何实现的,他们似乎都希望我去创建大量案例 classes。 有什么想法吗?
案例 类 不是从 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]
}
}
original doc 提供了所有详细信息。
Scala 2.12 在这里尝试使用 Lift-JSON 来解析配置文件。我有以下 myapp.json
配置文件:
{
"health" : {
"checkPeriodSeconds" : 10,
"metrics" : {
"stores" : {
"primary" : "INFLUX_DB",
"fallback" : "IN_MEMORY"
}
}
}
}
以及以下MyAppConfig
class:
case class MyAppConfig()
我的 myapp.json
将进化并可能变得非常大,其中包含许多嵌套的 JSON 结构。我 不想 必须为每个 JSON 对象创建 Scala 对象,然后像这样在 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”,其中有几十个案例 classes,它们的存在只是为了满足 [=45] 的序列化=] 进入 Scala 世界。
而不是,我想使用 Lift-JSON 来读取 myapp.json
配置文件,然后 MyAppConfig
具有 read/parse 值 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 文档来了解这种策略是如何实现的,他们似乎都希望我去创建大量案例 classes。 有什么想法吗?
案例 类 不是从 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]
}
}
original doc 提供了所有详细信息。