2016-04-28 10 views
5

Dieses JSON-Beispiel für automatisches Mapping aus der Dokumentation zum Abspielen schlägt fehl. Warum? https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomatedscala play json Nein unapply oder unapplySeq Funktion gefunden

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] 
+0

Für mich versagt es einfach nicht. Ich öffne amm repl, erhalte die Abhängigkeit über 'load.ivy (" com.typesafe.play "%%" play "%" 2.5.0 ")' und füge die 4 Zeilen Code ein, die '{" name ":" john "erhalten. , "Alter": 33} '. Dieser Fehler tritt normalerweise auf, wenn Ihre "Klasse" keine "Fallklasse" ist, aber hier ist alles in Ordnung. –

+0

Wow, ich wusste nichts über Ammonit! Es sieht gut aus, ich werde das jetzt versuchen –

+0

ja, es funktioniert auch für mich von der amm repl. : O Ich überprüfe noch einmal mein Projekt –

Antwort

6

sah Der problematische Code mehr oder weniger wie folgt aus:

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))) 
    } 
} 

Das Problem war hier, dass dieses Makro offenbar nicht für die Klassen innerhalb Methoden definiert funktioniert. Dies ist jedoch keine beunruhigende Einschränkung, da wir solche Dinge eher nicht tun.

Ausgabe Klasse def beheben kann woanders, wie Objektebene

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))) 
    } 
} 

oder Dateiebene

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))) 
    } 
} 

ich bewegt werden verstehen, dass dies nur zu Testzwecken war minimal Beispiel zu sehen, aber Ich werde noch erwähnen, wie wir Klassen normalerweise mit Writes definieren.

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

case class Resident(name: String, age: Int, role: Option[String]) 

Auf diese Weise, wenn Sie die Resident importieren, wird seine schreibt in dem impliziten Umfang sein.

+0

Die Fallklasse def war auf der Objektebene, als der Fehler zuerst auftrat. Ich habe es in die Methode verschoben, als ich ein minimales Beispiel erstellt habe, um das Problem zu zeigen. Allerdings habe ich nicht bemerkt, dass ich eine andere Art von Fehler bekommen habe. –

+0

Nun, wenn Sie diesen anderen Fehler reproduzieren können, könnte ich das auch ansprechen. –

+0

thx. Ich fand das Problem, ein implizites 'Json.write' für eine Abhängigkeit fehlte. –

Verwandte Themen