繁体   English   中英

播放框架-写入部分对象

[英]Play framework - Writes partial object

我有以下对象:

case class A(id: Long, name:String, lastName:Option[String], age:Int)

我想使用Writes转换器仅写入此对象的一部分。 因此,我尝试了以下代码(尝试编写没有年龄限制的对象):

implicit val aWrites: Writes[A] = (
  (JsPath \ "it").write[Long] and
  (JsPath \ "name").write[String] and 
  (JsPath \ "lastName"). writeNullable[String]
)(unlift(A.unapply))

但这显然无法编译。 有没有办法使这项工作?

您可以执行此操作,但不能引用A.unapply JSON组合器的部分简洁性来自于编译器针对案例类自动生成的applyunapply方法。 但是这些方法使用了类中的所有参数。

A.unapply具有签名A => Option[(Long, String, Option[String], Int)] 这与仅覆盖三个字段(而不是全部四个)的组合器不兼容。 您有两个选择。

1)写另一个unapply具有正确的签名式的方法:

def unapplyShort(a: A): Option[(Long, String, Option[String], Int)] =
    Some((a.id, a.name, a.lastName))

implicit val aWrites: Writes[A] = (
  (JsPath \ "id").write[Long] and
  (JsPath \ "name").write[String] and 
  (JsPath \ "lastName").writeNullable[String]
)(unlift(unapplyShort))

2)手动创建Writes作为匿名类:

implicit val aWrites: Writes[A] = new Writes[A] {
  def writes(a: A): JsValue = Json.obj(
    "id" -> a.id,
    "name" -> a.name,
    "lastName" -> a.lastName
  )
}

@mz中的选项1)可以更简洁地表示为:

implicit val aWrites: Writes[A] = (
  (JsPath \ "id").write[Long] and
  (JsPath \ "name").write[String] and
  (JsPath \ "lastName").writeNullable[String]
)((a) => (a.id, a.name, a.lastName))

仅供参考,您可以实现以下目标。 (这只是一个建议。)

object noWrites extends OWrites[Any] {
  override def writes(o: Any): JsObject = JsObject(Seq())
}

implicit val aWrites: Writes[A] = (
  (JsPath \ "id").write[Long] and
  (JsPath \ "name").write[String] and
  (JsPath \ "lastName").writeNullable[String] and noWrites // <---
)(unlift(A.unapply))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM