簡體   English   中英

沒有找到List [[java.util.UUID,String,String,String,Int,Int,Int,Int,java.sql.Timestamp)]的Json反序列化器

[英]No Json deserializer found for type List[(java.util.UUID, String, String, String, Int, Int, Int, Int, java.sql.Timestamp)]

我缺少scala技能,但是我一直在為此苦苦掙扎。 但是我在序列化和反序列化JSON時遇到問題。 我已經搜索並搜索了StackOverflow,但不幸的是我無法拼湊起來。

所以這是我的不得已。

我的模型是:

package models

import java.util.UUID
import java.sql.Timestamp


import play.api.db._
import play.api.Play.current
import play.api.libs.json._


import slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

case class User(
  id:UUID,
  username: String,
  password: String,
  email: String,
  comment_score_down: Int,
  comment_score_up: Int,
  post_score_down: Int,
  post_score_up: Int,
  created_on: Timestamp)

object Users extends
  Table[(UUID, String, String, String, Int, Int, Int, Int, Timestamp)]("users"){

  implicit object UserFormat extends Format[User] {

    implicit object UUIDFormatter extends Format[UUID] {
      def reads(s: JsString): UUID = java.util.UUID.fromString(s.toString)
      def writes(uuid: UUID) = JsString(uuid.toString)
    }

    implicit object TimestampFormatter extends Format[Timestamp] {
      def reads(s: JsValue): Timestamp = new Timestamp(s.toString.toLong)
      def writes(timestamp: Timestamp) = JsString(timestamp.toString)
    }


    def reads(json: JsValue): User = User(
        (json \ "id").as[UUID],
        (json \ "username").as[String],
        (json \ "password").as[String],
        (json \ "email").as[String],
        (json \ "comment_score_down").as[Int],
        (json \ "comment_score_up").as[Int],
        (json \ "post_score_down").as[Int],
        (json \ "post_score_up").as[Int],
        (json \ "created_on").as[Timestamp]
      )
     def writes(u: User): JsValue = JsObject(List(
         "id" -> JsString(u.id.toString),
         "username" -> JsString(u.username),
         "password" -> JsString(u.password),
         "email" -> JsString(u.email),
         "comment_score_down" -> JsString(u.comment_score_down.toString),
         "comment_score_up" -> JsString(u.comment_score_up.toString),
         "post_score_down" -> JsString(u.post_score_down.toString),
         "post_score_up" -> JsString(u.post_score_up.toString),
         "created_on" -> JsString(u.created_on.toString)
       ))
  }


  def id = column[UUID]("ID", O.PrimaryKey) // This is the primary key column
  def username = column[String]("username")
  def password = column[String]("password")
  def email = column[String]("email")
  def comment_score_down = column[Int]("comment_score_down")
  def comment_score_up = column[Int]("comment_score_up")
  def post_score_down = column[Int]("post_score_down")
  def post_score_up = column[Int]("post_score_up")
  def created_on = column[Timestamp]("created_on")

  def * = id ~ username ~ password ~ email ~ comment_score_down ~
    comment_score_up ~ post_score_down ~ post_score_up ~ created_on

}

我的控制器:

  def getUsers = Action {
    val json = database withSession {
      val users = for (u <- Users) yield u.*
      Json.toJson(users.list)
    }
    Ok(json).as(JSON)

  }

感謝您的時間!

凱,我感覺很甜。

對我的模型進行了一些編輯:

case class User(
  id:UUID,
  username: String,
  password: String,
  email: String,
  comment_score_down: Option[Int],
  comment_score_up: Option[Int],
  post_score_down: Option[Int],
  post_score_up: Option[Int],
  created_on: Timestamp)

object Users extends Table[User]("users"){     

我還更改了對象簽名,以便它可以返回類型User而不只是User的參數。 我只需要在投影方法(*)后面附加<>(User,User.unapply _)。

但是在我的控制器中:

我只需要:

  implicit object UserWrites extends Writes[User] {

    def writes(u: User) = Json.obj(
         "id" -> JsString(u.id.toString),
         "username" -> JsString(u.username),
         "password" -> JsString(u.password),
         "email" -> JsString(u.email),
         "comment_score_down" -> JsNumber(u.comment_score_down.getOrElse(0).toInt),
         "comment_score_up" -> JsNumber(u.comment_score_up.getOrElse(0).toInt),
         "post_score_down" -> JsNumber(u.post_score_down.getOrElse(0).toInt),
         "post_score_up" -> JsNumber(u.post_score_up.getOrElse(0).toInt),
         "created_on" -> JsString(u.created_on.toString)
    ) 


  }

作為控制器類的成員。

所以現在我的控制器動作是:

  def getUsers = Action {

    val json = database withSession {
      val users = for (u <- Users) yield u
      Json.toJson(users.list)
    }
    Ok(json).as(JSON)
  }

編輯:

另外,我將getUsers代碼作為findAll方法移到了我的模型中,也將我的可寫代碼也移到了該模型中。 我不喜歡控制器中的數據邏輯...

所以在我的控制器中,我只有一個方法/動作:

  def getUsers = Action {
    Ok(Users.findAll).as(JSON)
  }

我的模型現在看起來像:

package models

import java.util.UUID
import java.sql.Timestamp


import play.api.db._
import play.api.Play.current
import play.api.libs.json._


import slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

case class User(
  id:UUID,
  username: String,
  password: String,
  email: String,
  comment_score_down: Option[Int],
  comment_score_up: Option[Int],
  post_score_down: Option[Int],
  post_score_up: Option[Int],
  created_on: Timestamp)

object Users extends Table[User]("users") {

  lazy val database = Database.forDataSource(DB.getDataSource())

  def id = column[UUID]("id", O.PrimaryKey) // This is the primary key column
  def username = column[String]("username")
  def password = column[String]("password")
  def email = column[String]("email")
  def comment_score_down = column[Option[Int]]("comment_score_down")
  def comment_score_up = column[Option[Int]]("comment_score_up")
  def post_score_down = column[Option[Int]]("post_score_down")
  def post_score_up = column[Option[Int]]("post_score_up")
  def created_on = column[Timestamp]("created_on")

  implicit object UserWrites extends Writes[User] {

    def writes(u: User) = Json.obj(
         "id" -> JsString(u.id.toString),
         "username" -> JsString(u.username),
         "password" -> JsString(u.password),
         "email" -> JsString(u.email),
         "comment_score_down" -> JsNumber(u.comment_score_down.getOrElse(0).toInt),
         "comment_score_up" -> JsNumber(u.comment_score_up.getOrElse(0).toInt),
         "post_score_down" -> JsNumber(u.post_score_down.getOrElse(0).toInt),
         "post_score_up" -> JsNumber(u.post_score_up.getOrElse(0).toInt),
         "created_on" -> JsString(u.created_on.toString)
    )
  }

  def * = id ~ username ~ password ~ email ~ comment_score_down ~
    comment_score_up ~ post_score_down ~ post_score_up ~ created_on <>
    (User, User.unapply _)

  def findByPK(pk: UUID) =
    for (entity <- Users if entity.id === pk) yield entity

  def findAll = database withSession {
      val users = for (u <- Users) yield u
      Json.toJson(users.list)
    }

}

看來您的錯誤與您的writes方法有關。 您已經為用戶實現了反序列化器,但是沒有為用戶列表實現任何反序列化器。 我可以提供的最佳建議是使用List [User]的參數類型創建一個writes方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM