2013-11-21 6 views
5

Мой формат, методы чтения и записи не работают, и я не могу найти проблему. На мой взгляд Я реализовал Json.format, Json.reads и Json.writes, как и ожидалось. Если я компилирую мой код я получаю следующее сообщение об ошибке:Play Framework 2.2: Нет десанциализатора Json найдено

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

Моя модель:

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

Мой Действие:

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]("")) 
    } 

ответ

1

Json.toJson[T](obj: T) принимает неявное Writes[T] (который Format[T] орудия).

Затем вы преобразовываете Option[User] в Option[Tuple5[String, String, String, String, String]] и даете это toJson, чтобы компилятор попытался найти такой формат/записи. Наверное, не то, что вы намеревались.

То, что вы хотите, вероятно, что-то вроде этого:

def get(id: Long) = Action { 
    User.findById(id) 
    .map(user => Ok(Json.toJson(user))) 
    .getOrElse(BadRequest(s"Unknown user $id")) 
} 
Смежные вопросы