How to deserialize json to sealed trait using playframework in scala? -


i'm new in scala , got stuck in object deserialization. appreciate help.

so problem is, have sealed trait permission , case objects extend it:

sealed trait permission case object administrator extends permission case object dispatcher extends permission case object editor extends permission case object normaluser extends permission object permission {    def valueof(value: string): permission = value match {     case "administrator"  => administrator     case "dispatcher"     => dispatcher     case "editor"         => editor     case "normaluser"     => normaluser     case _                => throw new illegalargumentexception()   }    def stringvalueof(value: permission): string = value match {     case administrator  => "administrator"     case dispatcher     => "dispatcher"     case editor         => "editor"     case normaluser     => "normaluser"     case _              => throw new illegalargumentexception()   }  } 

and have user case class permission:

case class user(id: option[int],                 username: string,                 permission: permission,                 firstname: option[string]=none,                 lastname: option[string]=none) 

i've created json.reads[permission] , json.reads[user], whenever run code, no unapply function found exception. i've tried search same issue, didn't anything. please solve issue. thx.

using scala 2.11.x , playframework

play can automatically figure out json reader case classes. in case have define reader permission manually:

implicit val permissionreads: reads[permission] =    __.read[string].map(permission.valueof) 

this throw actual exception in case of problems permission format, instead of returning jserror. fix can use collect:

implicit val permissionreads: reads[permission] =    __.read[string].collect(validationerror("unsupported permission format"))(     function.unlift(s => scala.util.try(permission.valueof(s)).tooption)) 

if don't want long incantation function.unlift(s => scala.util.try(permission.valueof(s)).tooption can reduce replacing valueof (or adding new function object permission) partialfunction[string, permission] or function returning option[permission] instead of throwing error.


Comments

Popular posts from this blog

php - failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request -

java - How to filter a backspace keyboard input -

java - Show Soft Keyboard when EditText Appears -