環境
- Scala 2.12.5
- play-json 2.6.7
やりたいこと
オブジェクトを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]
}