【問題解決】Scala: Play-JSON: 「No instance of play.api.libs.json.Writes is available ...」というエラー発生

環境

やりたいこと

オブジェクトをJSONオブジェクトに変換したいです。

下記サイトを参考にしました。
Play Framework で JSON パースを簡単に

問題

Main.scala
object Main {
  def main(args: Array[String]): Unit = {

    val profile = Profile("miyatin", 21, List("Scala", "C#", "JavaScript", "PHP"),
      University("Kobe Univ",  "Engineering", 4 )
    )

    // ProfileクラスからJSONへ
    val profileJson = Json.toJson(profile)
    println(profileJson)

  }
}
Model.scala
object Profile {
  implicit val jsonWrites = Json.writes[Profile]

  implicit val jsonReads = Json.reads[Profile]
}



case class University(name: String, major: String, grade: Int)

object University {
  implicit val jsonWrites = Json.writes[University]

  implicit val jsonReads = Json.reads[University]
}


console
Error:(9, 40) No instance of play.api.libs.json.Writes is available for jp.co.sample.University in the implicit scope (Hint: if declared in the same file, make sure it's declared before)
  implicit val jsonWrites = Json.writes[Profile]

原因・解決方法

「もし同じファイルに定義しているならば、前に宣言されていないか確認しろ」とのことです。

以下のように宣言の順番を変えたら、動きました。

Model.scala
case class University(name: String, major: String, grade: Int)

object University {
  implicit val jsonWrites = Json.writes[University]

  implicit val jsonReads = Json.reads[University]
}


object Profile {
  implicit val jsonWrites = Json.writes[Profile]

  implicit val jsonReads = Json.reads[Profile]
}

補足

Json.writesの宣言です。マクロを使っています。

Json.scala
object Json extends JsonFacade {
  def writes[A]: OWrites[A] = macro JsMacroImpl.implicitConfigWritesImpl[A]
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.