scala play json找不到unapply或unapplySeq函数

Dav*_*lla 7 scala playframework

播放文档中的此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]
Run Code Online (Sandbox Code Playgroud)

Ism*_*l H 9

我是通过谷歌搜索来到这里的。

对我来说case class,有超过 22 个属性会导致相同的No unapply or unapplySeq function found错误

希望它能帮助别人


Łuk*_*asz 8

有问题的代码看起来或多或少是这样的:

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)))
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是这个宏显然不适用于方法中定义的类.这不是一个令人不安的限制,因为我们宁愿不做这种事情.

要解决问题类,可以将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)))
  }
}
Run Code Online (Sandbox Code Playgroud)

或文件级别

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)))
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道这只是出于测试目的而看到最小的例子,但我仍然会提到我们通常如何定义类Writes.

object Resident {
  implicit val residentWrites = Json.writes[Resident]
}

case class Resident(name: String, age: Int, role: Option[String])
Run Code Online (Sandbox Code Playgroud)

这样,无论何时导入Resident,其写入都将在隐式范围内.

  • 喜欢关于同伴对象的见解:拇指 (2认同)