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))