【发布时间】:2016-03-31 12:19:40
【问题描述】:
假设我有一些标记trait Ignore
我希望在序列化过程中忽略所有标记有此特征的字段。
所以如果我有课
case class A(a: Int) extends Ignore
case class B(f: String, a: A, d: Int)
序列化后 B 的 json 不应包含 a 字段。
注意:我知道有机会按名称忽略字段,但这不是我需要的。
【问题讨论】:
假设我有一些标记trait Ignore
我希望在序列化过程中忽略所有标记有此特征的字段。
所以如果我有课
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, ...).I建议使用 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))))
【讨论】:
case class B(a: A, d: Int) 产生 "{,"d":2}" 如何解决?
{"d":2}。您使用的是旧的 json4s 版本吗?我在 3.3.0