2016-04-28 21 views
5

Questo esempio di mappatura automatica JSON dalla documentazione di riproduzione non riesce. perché? https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomatedscala play json Non è stata trovata alcuna funzione unapply o unapplySeq

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

Per me semplicemente non fallisce. Apro amm repl, ottieni dipendenza tramite 'load.ivy (" com.typesafe.play "%%" play "%" 2.5.0 ")' e incolla le 4 righe di codice ottenendo '{" name ":" john " , "età": 33} '. Questo errore si verifica in genere quando il tuo 'class' non è un' case class', ma qui va tutto bene. –

+0

wow, non sapevo di Ammonite! Sembra fantastico, proverò questo ora –

+0

sì, funziona anche per me dal amm repl. : O controllerò di nuovo il mio progetto –

risposta

6

Il codice problematico sembrava più o meno così:

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

Il problema qui è che questa macro a quanto pare non funziona per le classi definite all'interno di metodi. Questa non è una limitazione preoccupante anche se preferiamo non fare questo genere di cose.

Per risolvere questione di classe def può essere spostato da qualche altra parte, come livello di oggetto

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

o livello di file

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

ho capito che questo era solo a scopo di test per vedere un esempio minimo, ma Citerò ancora come di solito definiamo le classi con Writes.

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

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

In questo modo, ogni volta che si importa il Resident, le sue scritture sarà nel campo di applicazione implicita.

+0

la classe case def era a livello di oggetto quando è apparso l'errore. l'ho spostato all'interno del metodo quando ho creato un esempio minimo per mostrare il problema. tuttavia non mi sono reso conto che stavo ottenendo un diverso tipo di errore. –

+0

Beh, se riesci a riprodurre quell'altro errore, potrei farlo anche io. –

+0

thx. ho trovato il problema, mancava un implicito 'Json.write' per una dipendenza. –

Problemi correlati