Scala 使用Jackson将类序列化为其一个成员

Scala 使用Jackson将类序列化为其一个成员,scala,serialization,jackson,Scala,Serialization,Jackson,有时该类只有一个要序列化的成员(其他成员是暂时的),我希望将该类作为其唯一成员进行序列化和反序列化 考虑以下代码: import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper case c

有时该类只有一个要序列化的成员(其他成员是暂时的),我希望将该类作为其唯一成员进行序列化和反序列化

考虑以下代码:

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]}
。我想我可以用自定义序列化器/反序列化器来实现这一点,但在实际情况中,如果内容是一个复杂的类,这意味着我必须手动序列化内容,如果我没有弄错的话。我更喜欢一些更直接的解决方案

是否可以将序列化/反序列化“委托”给成员/构造函数参数?

可以使用来完成,这可用于使用
JsonSerialize
JsonSerialize
属性修改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
}