scala play json не найдена функция unapply или unapplySeq

этот пример автоматического сопоставления 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]

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, его записи будут находиться в неявной области.