在Play2.2 Scala中将通用案例类自动序列化/反序列化为JSON
发布时间:2020-12-16 18:30:24 所属栏目:安全 来源:网络整理
导读:此问题基于以下示例,该示例尝试从 JSON反序列化案例类Node [Bird]. import play.api.libs.json._import play.api.libs.functional.syntax._object ValidationTest { case class Node[T](_id: Int,thing: T) case class Bird(name: String,color: String) //
此问题基于以下示例,该示例尝试从
JSON反序列化案例类Node [Bird].
import play.api.libs.json._ import play.api.libs.functional.syntax._ object ValidationTest { case class Node[T](_id: Int,thing: T) case class Bird(name: String,color: String) // ERROR -- No apply function found matching unapply parameters implicit val birdNodeFormat = Json.format[Node[Bird]] val birdNodesJson: JsValue = Json.arr( Json.obj( "_id" -> 0,"thing" -> Json.obj( "name" -> "Cardinal","color" -> "Red" ) ),Json.obj( "_id" -> 1,"thing" -> Json.obj( "name" -> "Bluejay","color" -> "Blue" ) ) ) val birdNodesResult = birdNodesJson.validate[Seq[Node[Bird]]] } 在前面的示例中,Scala无法为格式宏解析Node [Bird]的正确apply / unapply函数. // ERROR -- No apply function found matching unapply parameters implicit val birdNodeFormat = Json.format[Node[Bird]] 但是,使用非泛型案例类(如BirdNode)没有问题. case class BirdNode(_id: Int,thing: Bird) // WORKS implicit val birdNodeFormat = Json.format[BirdNode] ... // WORKS val birdNodesResult = birdNodesJson.validate[Seq[BirdNode]] 在Play 2.2中将节点[Bird]序列化/反序列化为JSON的最佳方法是什么? 解决方法
您可能必须在不使用宏的情况下定义Node [T]的格式,但这可以:
implicit val birdFormat: Format[Bird] = Json.format[Bird] implicit def nodeFormat[T : Format]: Format[Node[T]] = ((__ "_id").format[Int] ~ (__ "thing").format[T] )(Node.apply,unlift(Node.unapply)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |