Error in json serialization in Scala with Play2 -


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