scala - 如何解析 json 并根据其内容提取到不同的案例类

标签 scala json4s

我正在尝试使用 json4s 以 json 格式解析不同类型的事件。我编写了一些案例类来表示所有从基类继承的不同事件 Event :

  abstract class Event{ def EventType : String }
  case class StartSession(val EventType: String, val Platform: String) extends Event
  case class AdView(val EventType: String, val EventSubtype: String) extends Event

这是我用来解析 StartSession 的函数事件:
  def parser(json: String): Event = {
    val parsedJson = parse(json)
    val s = parsedJson.extract[StartSession]
    return s
  }

此函数将正确解析类似 {"EventType":"StartSession","Platform":"Portal"} 的 json

我正在寻找一种方法来概括解析器函数,以便我可以使用它来解析从 Event 继承的所有类型的事件。然后对函数的返回值进行模式匹配。

最佳答案

类型提示提供了问题的解决方案。如果你有一个多态类型,比如 Event ,类型提示(此处为 EventType )告诉 json4s 应该将 json 对象反序列化为哪种实际类型。

作为引用,请查看 github page of json4s .有一节叫做“ 序列化多态列表”。

由于类型提示仅用于反序列化,我们可以去掉字段EventTypeEvent .

abstract class Event
case class StartSession(Platform: String) extends Event
case class AdView(EventSubtype: String) extends Event

我们需要带一个 Formats实例进入extract的范围.该实例告诉 json4s 如何执行反序列化。在我们的例子中,我们需要专门化 typeHintFieldNametypeHints .第一个是我们类型提示的键,在示例中它是 "EventType" .后者是从字符串值到类的映射。如果我们使用类名作为值,那么 ShortTypeHints会做的伎俩。否则,我们可以实现我们自己的、专门的 TypeHints .

具体的解决方案如下:
def main(args: Array[String]): Unit ={
  val json =
    s"""
       |[
       |  {
       |    "EventType": "StartSession",
       |    "Platform": "Portal"
       |  },
       |  {
       |    "EventType": "AdView",
       |    "EventSubtype": "SpecializedView"
       |  }
       |]
     """.stripMargin
  implicit val formats = new DefaultFormats {
    override val typeHintFieldName: String = "EventType"
    override val typeHints: TypeHints =
      ShortTypeHints(
        List(classOf[StartSession], classOf[AdView])
      )
  }
  val parsedJson = parse(json)
  val s = parsedJson.extract[List[Event]]
  println(s)
}

关于scala - 如何解析 json 并根据其内容提取到不同的案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841544/

相关文章:

scala - 通过 Scala 宏生成的循环不相等

json - 在 Scala 中转换 JSON 对象的问题

scala - Json4s 支持带有特征混合的案例类

json4s - json4s中是否有针对UUID的开箱即用的(反)序列化器?

scala - 可序列化和 AnyVal

scala - 基于具有交集的外部数组过滤数据框数组项

java - 如何在 Scala 中从 JSON 解析通用类参数?

scala - json4s - 如何使用多个 FieldSerializer

scala - 无法使用 org.scalatest.tools.Runner 从命令行运行测试

scala - 如何在spark 1.6版本中执行BETWEEN条件