scala play json 找不到 unapply 或 unapplySeq 函数
Posted
技术标签:
【中文标题】scala play json 找不到 unapply 或 unapplySeq 函数【英文标题】:scala play json No unapply or unapplySeq function found 【发布时间】:2016-04-28 21:58:34 【问题描述】:play 文档中的这个 JSON 自动映射示例失败。为什么? 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]
【问题讨论】:
对我来说它根本不会失败。我打开 amm repl,通过load.ivy("com.typesafe.play" %% "play" % "2.5.0")
获取依赖关系,然后粘贴 4 行代码,获取 "name":"john","age":33
。当您的class
不是case class
时,通常会发生此错误,但这里一切正常。
哇,我不知道菊石!看起来不错,我现在就试试这个
是的,它也适用于我的 amm repl。 :O 我会再次检查我的项目
所以,它适用于 amm repl。但是我已经创建了一个最小的 sbt 项目,但我仍然在同一台计算机(OSX 10.10.5)中遇到错误:O 你能签出这个项目并测试它吗? github.com/dportabella/test
问题是你在一个方法中声明你的类,我无法解释为什么这不起作用但是将案例类移出主要方法,进入object Test
或文件级别使这个编译。
【参考方案1】:
有问题的代码看起来或多或少是这样的:
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)))
这里的问题是这个宏显然不适用于定义在方法中的类。这不是一个令人不安的限制,因为我们宁愿不做这种事情。
要解决问题,可以将类 def 移动到其他地方,例如对象级别
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
定义类。
object Resident
implicit val residentWrites = Json.writes[Resident]
case class Resident(name: String, age: Int, role: Option[String])
这样,无论何时导入 Resident
,它的写入都将在隐式范围内。
【讨论】:
第一次出现错误时,案例类 def 处于对象级别。在构建一个最小示例来显示问题时,我将它移到了方法中。但是我没有意识到我遇到了不同类型的错误。 如果你能重现其他错误,我也可以解决。 谢谢。我发现了问题,缺少一个隐含的Json.write
依赖项。
喜欢关于伴侣对象的见解:thumbs以上是关于scala play json 找不到 unapply 或 unapplySeq 函数的主要内容,如果未能解决你的问题,请参考以下文章
找不到类的 ScalaSig - json4s with scala + proguard for an android app
Play 2.2:使用 Play Caching (Scala) 对代码进行单元测试时出现问题
Scala,使用 play 2.5 将 joda.LocalDateTime 转换为 json