Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用Writes trait和unapply仅序列化特定属性_Json_Scala_Serialization_Playframework - Fatal编程技术网

Json 使用Writes trait和unapply仅序列化特定属性

Json 使用Writes trait和unapply仅序列化特定属性,json,scala,serialization,playframework,Json,Scala,Serialization,Playframework,假设我有这样一个案例类: case class Product(ean: Long, name: String, description: String) implicit val productWrites: Writes[Product] = ( (JsPath \ "ean").write[Long] and (JsPath \ "name").write[String] and (JsPath \ "description").write[String] )(unlift(

假设我有这样一个案例类:

case class Product(ean: Long, name: String, description: String)
implicit val productWrites: Writes[Product] = (
  (JsPath \ "ean").write[Long] and
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit val productWrites: Writes[Product] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit object ProductWrites extends Writes[Product] {
  def writes(p: Product) = Json.obj(
    "name" -> Json.toJson(p.name),
    "description" -> Json.toJson(p.description)
  )
}
我想将这个类的对象序列化为Json,我可以实现这样的写入特性:

case class Product(ean: Long, name: String, description: String)
implicit val productWrites: Writes[Product] = (
  (JsPath \ "ean").write[Long] and
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit val productWrites: Writes[Product] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit object ProductWrites extends Writes[Product] {
  def writes(p: Product) = Json.obj(
    "name" -> Json.toJson(p.name),
    "description" -> Json.toJson(p.description)
  )
}
如果我想序列化对象的所有属性,这很好。现在让我们假设我不想序列化
ean
。我试过这样的方法:

case class Product(ean: Long, name: String, description: String)
implicit val productWrites: Writes[Product] = (
  (JsPath \ "ean").write[Long] and
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit val productWrites: Writes[Product] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit object ProductWrites extends Writes[Product] {
  def writes(p: Product) = Json.obj(
    "name" -> Json.toJson(p.name),
    "description" -> Json.toJson(p.description)
  )
}
这似乎不起作用,因为需要使用unapply方法返回的所有字段/属性

是否有办法使第二个序列化方法仅与我要序列化的属性一起工作,或者我必须使用类似以下内容:

case class Product(ean: Long, name: String, description: String)
implicit val productWrites: Writes[Product] = (
  (JsPath \ "ean").write[Long] and
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit val productWrites: Writes[Product] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(unlift(Product.unapply))
implicit object ProductWrites extends Writes[Product] {
  def writes(p: Product) = Json.obj(
    "name" -> Json.toJson(p.name),
    "description" -> Json.toJson(p.description)
  )
}

这是唯一的办法吗?

我认为你的最后一个例子就是最好的办法。下面是使用隐式val而不是隐式对象执行相同操作的另一种方法:

implicit val productWrites: Writes[Product] = Writes { p =>
  Json.obj(
    "name" -> Json.toJson(p.name),
    "description" -> Json.toJson(p.description)
  )
}

我认为你的最后一个例子是正确的。下面是使用隐式val而不是隐式对象执行相同操作的另一种方法:

implicit val productWrites: Writes[Product] = Writes { p =>
  Json.obj(
    "name" -> Json.toJson(p.name),
    "description" -> Json.toJson(p.description)
  )
}
unlift(Product.unapply)
有一个类型
Product=>(Long,String,String)

在本例中,参数的类型应为
Product=>(String,String)
。您可以编写如下所示的函数文本

implicit val productWrites: Writes[Product] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(p => (p.name, p.description))
unlift(Product.unapply)
有一个类型
Product=>(Long,String,String)

在本例中,参数的类型应为
Product=>(String,String)
。您可以编写如下所示的函数文本

implicit val productWrites: Writes[Product] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "description").write[String]
)(p => (p.name, p.description))