将 class 序列化为它与 Jackson 的一个成员
Serialize class as its one member with Jackson
有时 class 只有一个成员需要序列化(其他成员是临时的),我想将这个 class 作为它的唯一成员进行序列化和反序列化。
考虑以下代码:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class Content(i:Seq[Int])
case class Wrap(content:Content)
object Main extends App {
val om = new ObjectMapper() with ScalaObjectMapper {
registerModule(new DefaultScalaModule)
}
val roots = Wrap(Content(Seq(1,2,3)))
val out = om.writeValueAsString(roots)
println(out)
val test = om.readValue(out, classOf[Wrap])
println(test)
}
Wrap
的序列化结果为{"content":{"i":[1,2,3]}}
。
我只想得到 {"i":[1,2,3]}
。我想我可以使用自定义 serializer/deserializer 来做到这一点,但在实际情况下,内容是复杂的 class,这意味着如果我没记错的话,我将不得不手动序列化内容。我更喜欢一些更直接的解决方案。
是否可以 "delegate" serialization/deserialization 到 member/constructor 参数?
可以使用 converters 来完成,它可以使用 JsonSerialize
和 JsonDeserialize
属性来修改 Jackson 的行为。
import com.fasterxml.jackson.databind.annotation.{JsonSerialize, JsonDeserialize}
import com.fasterxml.jackson.databind.util.StdConverter
@JsonDeserialize(converter=classOf[WrapConverterDeserialize])
@JsonSerialize(converter=classOf[WrapConverterSerialize])
case class Wrap(content:Content)
class WrapConverterDeserialize extends StdConverter[Content,Wrap] {
override def convert(value: Content) = new Wrap(value)
}
class WrapConverterSerialize extends StdConverter[Wrap,Content] {
override def convert(value: Wrap) = value.content
}
有时 class 只有一个成员需要序列化(其他成员是临时的),我想将这个 class 作为它的唯一成员进行序列化和反序列化。
考虑以下代码:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class Content(i:Seq[Int])
case class Wrap(content:Content)
object Main extends App {
val om = new ObjectMapper() with ScalaObjectMapper {
registerModule(new DefaultScalaModule)
}
val roots = Wrap(Content(Seq(1,2,3)))
val out = om.writeValueAsString(roots)
println(out)
val test = om.readValue(out, classOf[Wrap])
println(test)
}
Wrap
的序列化结果为{"content":{"i":[1,2,3]}}
。
我只想得到 {"i":[1,2,3]}
。我想我可以使用自定义 serializer/deserializer 来做到这一点,但在实际情况下,内容是复杂的 class,这意味着如果我没记错的话,我将不得不手动序列化内容。我更喜欢一些更直接的解决方案。
是否可以 "delegate" serialization/deserialization 到 member/constructor 参数?
可以使用 converters 来完成,它可以使用 JsonSerialize
和 JsonDeserialize
属性来修改 Jackson 的行为。
import com.fasterxml.jackson.databind.annotation.{JsonSerialize, JsonDeserialize}
import com.fasterxml.jackson.databind.util.StdConverter
@JsonDeserialize(converter=classOf[WrapConverterDeserialize])
@JsonSerialize(converter=classOf[WrapConverterSerialize])
case class Wrap(content:Content)
class WrapConverterDeserialize extends StdConverter[Content,Wrap] {
override def convert(value: Content) = new Wrap(value)
}
class WrapConverterSerialize extends StdConverter[Wrap,Content] {
override def convert(value: Wrap) = value.content
}