我正在尝试为一个案例类编写一个自定义的Json序列化程序,但我不希望它序列化该类的所有字段.我对Scala很新,所以这肯定是问题,但这是我到目前为止所尝试的:
case class Foo(a: String, b: Int, c: Double)
现在,这样做的默认方式,就我在示例中看到的是:
implicit val fooWrites: Writes[Foo] = ( (__ \ "a").write[String] and (__ \ "b").write[Int] (__ \ "c").write[Double] ) (unlift(Foo.unapply))
但是如果我想从Json输出中省略"c"怎么办?到目前为止我已经尝试过这个但是它没有编译:
implicit val fooWritesAlt: Writes[Foo] = ( (__ \ "a").write[String] and (__ \ "b").write[Int] ) (unlift({(f: Foo) => Some((f.a, f.b))}))
任何帮助是极大的赞赏!
我通常做的是将字段转换为None并在其上使用writeNullable:
implicit val fooWrites: Writes[Foo] = ( (__ \ "a").write[String] and (__ \ "b").write[Int] (__ \ "c").writeNullable[Double].contramap((_: Double) => None) ) (unlift(Foo.unapply))
可以直接构造OWrites,而不是指定生成OWrites实例的组合器:
val ignore = OWrites[Any](_ => Json.obj()) implicit val fooWrites: Writes[Foo] = ( (__ \ "a").write[String] and (__ \ "b").write[Int] and ignore ) (unlift(Foo.unapply))
这将忽略该位置的case类的任何值,并且只是总是返回一个空的JSON对象.
如果你正在使用Playframework 2.2(不确定早期版本,但它应该也可以),试试这个:
implicit val writer = new Writes[Foo] { def writes(foo: Foo): JsValue = { Json.obj("a" -> foo.a, "b" -> foo.b) } }