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

Scala + Play Framework + Slick - Json 作为模型字段

带有 Play 2.4 / Scala 的 Json 格式

Play/Scala如何防止空数组的Json序列化?