i have following 3 case classes
case class delete(var deletestatus : deletestatus , var deletereason : deletereason) // deletestatus , deletereason 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] ) i want serialize them json , not sure how should
i have tried
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) ) but gives following error on mgs.delete in writemessage , mgslist in 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 please guide me how can get rid off it
and there better way of doing this?
when use json.obj(...) construct json object various implicit conversions available convert common types (e.g. string, int) json wrapper types (jsstring, jsnumber). problem code there no implicit conversions available convert delete , message types json. 1 option use explicit conversion functions directly, e.g:
"delete" -> writedelete(mgs.delete) and (using json.arr(...) construct json array):
"msglist" -> json.arr(inbox.getmessagelist.toseq.map(writemessage): _*) however, more idiomatic way use json inception macros automatically generate (implicit) serializers types.
simplifying slightly, this:
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] } you should able automatically serialize (and de-serialize) delete, message, , inbox objects using json.tojson(thing) because find implicit format object (a combined reads , writes) on companion object of each custom type.
one complication here case classes contain enums; if they're scala enumerations see this answer how convert them. leave exercise reader.
Comments
Post a Comment