繁体   English   中英

使用Play2在Scala中进行JSON序列化时出错

[英]Error in json serialization in Scala with Play2

我有以下三个案例类

case  class  Delete(var deleteStatus : DeleteStatus , var deleteReason : DeleteReason) // DeleteStatus and DeleteReason are enums

case class Message(val uuid: Int ,val subject : String, val body : String, var awt : Int,val dateTime : LocalDateTime = LocalDateTime.now(), delete : Delete)

case class Inbox( val uuid : Int,var messageList : ListBuffer[Message] )

我想将它们序列化为Json,但我不确定该怎么做

我已经尝试过了

def writedelete(delete: Delete) = Json.obj(
      "deleteStatus" ->  delete.getDeleteStatusInt.toString, 
      "deleteReason" -> delete.getDeleteReasonInt.toString
    )

      def writeMessage(mgs : Message)= Json.obj(
        "uuid" -> mgs.getUuid ,
        "subject" -> mgs.getSubject,
        "body" -> mgs.getBody,
        "awt" -> mgs.getAwt,
        "datetime" -> mgs.getdateTime.toString,
        "delete" -> mgs.delete
      )



    def writeInbox(inbox : Inbox)= Json.obj(
        "uuid" -> inbox.getUuid,
        "mgslist" -> Seq(inbox.getMessageList)
     )

但是它在mgs.delete中的writeMessagemgslist中的writeInbox上给出以下错误

type mismatch; found : models.UserNotifications.MailMessages.Delete 
 required: play.api.libs.json.Json.JsValueWrapper

type mismatch; found : 
 Seq[scala.collection.mutable.ListBuffer[models.UserNotifications.MailMessages.Message]] 
 required: play.api.libs.json.Json.JsValueWrapper

请指导我如何摆脱它

还有没有更好的方法呢?

当您使用Json.obj(...)构造JSON对象时,可以使用各种隐式转换将常见类型(例如StringInt )转换为其JSON包装器类型( JsStringJsNumber )。 您的代码存在问题,因为没有隐式转换可用于将DeleteMessage类型转换为JSON。 一种选择是直接使用您的显式转换函数,例如:

"delete" -> writeDelete(mgs.delete)

和(使用Json.arr(...)构造JSON数组):

"msglist" -> Json.arr(inbox.getMessageList.toSeq.map(writeMessage): _*)

但是,更惯用的方法是使用JSON Inception宏自动为您的类型生成(隐式)序列化器。

稍微简化一下,这看起来像这样:

case class Delete(deleteStatus: DeleteStatus, deleteReason: DeleteReason)
object Delete {
  implicit val _format = Json.format[Delete]
}

case class Message(uuid: Int, subject: String, body: String, awt: Int, dateTime: LocalDateTime, delete: Delete)
object Message {
  implicit val _format = Json.format[Message]
}

case class Inbox(uuid: Int, messageList: ListBuffer[Message])
object Inbox {
  implicit val _format = Json.format[Message]
}

现在,您应该可以使用Json.toJson(thing)自动序列化DeleteMessage )和Inbox Json.toJson(thing) Inbox对象,因为它会在每个同伴对象上找到一个隐式Format对象( ReadsWrites组合)。自定义类型。

一种复杂的情况是您的案例类包含枚举。 如果它们是Scala枚举,请参阅此答案以了解如何进行转换。 我把它留给读者作为练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM