使用 spray-json 对子类进行序列化和反序列化

Serialization and Deserialization of Subclasses with spray-json

假设我有一个基础 class B 和两个子classes S1 和 S2。

我想序列化和反序列化 class S1 和 S2。

因此我有两个问题:

  1. 是否可以为 class B 编写一个 JsonFormat 并在 class S1 和 S2 中使用它进行序列化?

  2. 我想要两个反序列化 class S1 和 S2。但是我不知道 json 字符串代表 class S1 还是 S2,所以我想我不能使用 spray-json 方法 convertTo 因为我必须知道我想要的确切类型反序列化。

我对 2. 的解决方案是编写一个包装器 class,其中包含类型(S1 或 S2)的字符串和 S1 或 S2 的 json 字符串。这是两个最好的方法还是有其他更好的方法?

提前致谢

这是可能的,但您的格式不会(也不能)序列化 S1S2 中不属于 B 的任何细节。

我建议为 S1S2 使用单独的格式,然后为 B 使用自定义格式,委托给适当的格式:

implicit val s1Format = jsonFormat3(S1) //assuming S1 and S2 are case classes
implicit val s2Format = jsonFormat5(S2) //with 3 and 5 parameters respectively
implicit object bFormat extends RootJsonFormat[B] {
  //assuming both objects have a field called "myTypeField"
  def read(jv: JsValue) = jv.asJsObject.fields("myTypeField") match {
      case JsString("s1") => jv.convertTo[S1]
      case JsString("s2") => jv.convertTo[S2]
    }
  def write(b: B) = b match {
    case s1: S1 => s1Format.write(s1)
    case s2: S2 => s2Format.write(s2)
  }
}