问题描述
播放文档中的此JSON自动映射示例失败.为什么? https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated
This JSON automated mapping example from the play documentation fails. why?https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated
libraryDependencies += "com.typesafe.play" %% "play" % "2.5.0"
---
import play.api.libs.json._
case class Resident(name: String, age: Int, role: Option[String])
implicit val residentWrites = Json.writes[Resident]
println(Json.toJson(Resident("john", 33, None)))
---
Error: No unapply or unapplySeq function found
implicit val residentWrites = Json.writes[Resident]
推荐答案
有问题的代码或多或少是这样的:
The problematic code looked more or less like that:
import play.api.libs.json._
object Test {
def main(args: Array[String]): Unit = {
case class Resident(name: String, age: Int, role: Option[String])
implicit val residentWrites = Json.writes[Resident]
println(Json.toJson(Resident("john", 33, None)))
}
}
这里的问题是,此宏显然不适用于在方法内部定义的类.这不是一个令人不安的限制,尽管我们宁愿不做这种事情.
The issue here was that this macro apparently doesn't work for classes defined inside methods. This is not a troubling limitation though as we rather don't do this sort of things.
要解决问题,可以将类定义def移到其他位置,例如对象级别
To resolve issue class def can be moved somewhere else, like object level
object Test {
case class Resident(name: String, age: Int, role: Option[String])
def main(args: Array[String]): Unit = {
implicit val residentWrites = Json.writes[Resident]
println(Json.toJson(Resident("john", 33, None)))
}
}
或文件级别
case class Resident(name: String, age: Int, role: Option[String])
object Test {
def main(args: Array[String]): Unit = {
implicit val residentWrites = Json.writes[Resident]
println(Json.toJson(Resident("john", 33, None)))
}
}
我知道这只是出于测试目的,以查看最少的示例,但是我仍然会提到我们通常如何使用Writes
定义类.
I understand that this was only for test purposes to see minimal example, but I will still mention how we usually define classes with Writes
.
object Resident {
implicit val residentWrites = Json.writes[Resident]
}
case class Resident(name: String, age: Int, role: Option[String])
这样,每当导入Resident
时,其写操作都将位于隐式作用域中.
This way, whenever you import the Resident
, its writes will be in the implicit scope.
这篇关于scala play json未找到unapply或unapplySeq函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!