[英]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
中的writeMessage
和mgslist
中的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对象时,可以使用各种隐式转换将常见类型(例如String
, Int
)转换为其JSON包装器类型( JsString
, JsNumber
)。 您的代码存在问题,因为没有隐式转换可用于将Delete
和Message
类型转换为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)
自动序列化Delete
, Message
)和Inbox
Json.toJson(thing)
Inbox
对象,因为它会在每个同伴对象上找到一个隐式Format
对象( Reads
和Writes
组合)。自定义类型。
一种复杂的情况是您的案例类包含枚举。 如果它们是Scala枚举,请参阅此答案以了解如何进行转换。 我把它留给读者作为练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.