我正在尝试使用 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 .有一节叫做“ 序列化多态列表”。
由于类型提示仅用于反序列化,我们可以去掉字段EventType
在 Event
.
abstract class Event
case class StartSession(Platform: String) extends Event
case class AdView(EventSubtype: String) extends Event
我们需要带一个
Formats
实例进入extract
的范围.该实例告诉 json4s 如何执行反序列化。在我们的例子中,我们需要专门化 typeHintFieldName
和 typeHints
.第一个是我们类型提示的键,在示例中它是 "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/