2013-11-21 10 views
5

Mein Format, liest und schreibt Methoden funktionieren nicht und ich bin nicht in der Lage, das Problem zu lokalisieren. Meiner Meinung nach Ich habe Json.format, Json.reads und Json.writes wie erwartet implementiert. Wenn ich meinen Code kompilieren bekomme ich folgende Fehlermeldung:Play Framework 2.2: Nein Jsons Deserializer gefunden

No Json deserializer found for type Option[(String, String, String, String, String)] 

My Model:

object User { 

    val simple = { 
     get[Option[Long]]("id") ~ 
     get[String]("username") ~ 
     get[String]("email") ~ 
     get[String]("firstname") ~ 
     get[String]("lastname") map { 
     case id ~ username ~ email ~ firstname ~ lastname => User(
      id, username, email, firstname, lastname) 
     } 
    } 

    implicit val userFormatter = Json.format[User] 
    implicit val userReads = Json.reads[User] 
    implicit val userWrites = Json.writes[User] 

    def findById(id: Long): Option[User] = { 
     DB.withConnection { 
     implicit connection => 
      SQL("select * from \"user\" where id = {id}").on('id -> id).as(User.simple.singleOpt) 
     } 
    } 
} 

Meine Aktion:

def get(id: Long) = Action { 
    Ok(Json.toJson(User.findById(id).map { 
     user => 
     (user.id.toString, user.username, user.email, user.firstname, user.lastname) 
    }).getOrElse[String]("")) 
    } 

Antwort

1

Json.toJson[T](obj: T) nimmt ein impliziten Writes[T] (die Format[T] Geräte).

Dann transformieren Sie eine Option[User] in eine Option[Tuple5[String, String, String, String, String]] und geben Sie das an toJson, damit der Compiler versucht, ein solches Format/Writes zu finden. Wahrscheinlich nicht, was Sie vorhatten.

Was Sie wollen, ist wahrscheinlich so etwas wie folgt aus:

def get(id: Long) = Action { 
    User.findById(id) 
    .map(user => Ok(Json.toJson(user))) 
    .getOrElse(BadRequest(s"Unknown user $id")) 
}