LoginSignup
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-10

環境

やりたいこと

オブジェクトを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]
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1