使用 spray-json 对子类进行序列化和反序列化
Serialization and Deserialization of Subclasses with spray-json
假设我有一个基础 class B 和两个子classes S1 和 S2。
我想序列化和反序列化 class S1 和 S2。
因此我有两个问题:
是否可以为 class B 编写一个 JsonFormat 并在 class S1 和 S2 中使用它进行序列化?
我想要两个反序列化 class S1 和 S2。但是我不知道 json 字符串代表 class S1 还是 S2,所以我想我不能使用 spray-json 方法 convertTo 因为我必须知道我想要的确切类型反序列化。
我对 2. 的解决方案是编写一个包装器 class,其中包含类型(S1 或 S2)的字符串和 S1 或 S2 的 json 字符串。这是两个最好的方法还是有其他更好的方法?
提前致谢
这是可能的,但您的格式不会(也不能)序列化 S1
或 S2
中不属于 B
的任何细节。
我建议为 S1
和 S2
使用单独的格式,然后为 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)
}
}
假设我有一个基础 class B 和两个子classes S1 和 S2。
我想序列化和反序列化 class S1 和 S2。
因此我有两个问题:
是否可以为 class B 编写一个 JsonFormat 并在 class S1 和 S2 中使用它进行序列化?
我想要两个反序列化 class S1 和 S2。但是我不知道 json 字符串代表 class S1 还是 S2,所以我想我不能使用 spray-json 方法 convertTo 因为我必须知道我想要的确切类型反序列化。
我对 2. 的解决方案是编写一个包装器 class,其中包含类型(S1 或 S2)的字符串和 S1 或 S2 的 json 字符串。这是两个最好的方法还是有其他更好的方法?
提前致谢
这是可能的,但您的格式不会(也不能)序列化 S1
或 S2
中不属于 B
的任何细节。
我建议为 S1
和 S2
使用单独的格式,然后为 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)
}
}