json4s - 在序列化期间忽略特定类型的字段

json4s - Ignore field of particular type during serialization

假设我有一些标记 trait Ignore 我希望在序列化期间忽略所有标记有此特征的字段。

所以如果我有 class

case class A(a: Int) extends Ignore
case class B(f: String, a: A, d: Int)

序列化后 B 的 json 不应包含 a 字段。

注意:我知道可以通过名称忽略字段,但这不是我需要的。

您可以使用 CustomSerializer。 您可以通过提供空 PartialFunction 作为反序列化器来仅自定义序列化:

trait Ignore
case class A(a: Int) extends Ignore
case class B(f: String, a: A, d: Int)

implicit val formats = DefaultFormats +
  new CustomSerializer[Ignore](formats => (
  PartialFunction.empty,
  { case _: Ignore => JNothing }
  ))

// prints "{"f":"x","d":2}"
println(Serialization.write(B("x", A(1), 2)))
// deserializes to B(x,A(1),2)
println(Serialization.read[B]("""{"f":"x","a":{"a":1},"d":2}"""))

编辑:在编写 (3.3.0) 时,json4s-native 有一个错误,如果 first 字段被忽略,它会错误地呈现序列化对象(例如case class B(a: A, ...)。我建议使用json4s-jackson直到问题解决

先使用 Extraction.decompose 后使用 Serialization 似乎可以解决问题:

trait Ignore
case class A(a: Int) extends Ignore
case class B(a: A, d: Int)

implicit val formats = DefaultFormats +
  new CustomSerializer[Ignore](formats => (
    PartialFunction.empty,
    { case _: Ignore => JNothing }
    ))

// prints {,"d":2}
println(Serialization.write(B(A(1), 2)))
// prints {"d":2}
println(Serialization.write(Extraction.decompose(B(A(1), 2))))