Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

serializing objects to json with play.api.libs.json

I'm trying to serialize some relatively simple models into json. For example, I'd like to get the json representation of:

case class User(val id: Long, val firstName: String, val lastName: String, val email: Option[String]) {
    def this() = this(0, "","", Some(""))
}

Do i need to write my own Format[User] with the appropriate reads and writes methods or is there some other way? I've looked at https://github.com/playframework/Play20/wiki/Scalajson but I'm still a bit lost.

like image 620
LuxuryMode Avatar asked Aug 16 '12 01:08

LuxuryMode


1 Answers

Yes, writing your own Format instance is the recommended approach. Given the following class, for example:

case class User(
  id: Long, 
  firstName: String,
  lastName: String,
  email: Option[String]
) {
  def this() = this(0, "","", Some(""))
}

The instance might look like this:

import play.api.libs.json._

implicit object UserFormat extends Format[User] {
  def reads(json: JsValue) = User(
    (json \ "id").as[Long],
    (json \ "firstName").as[String],
    (json \ "lastName").as[String],
    (json \ "email").as[Option[String]]
  )

  def writes(user: User) = JsObject(Seq(
    "id" -> JsNumber(user.id),
    "firstName" -> JsString(user.firstName),
    "lastName" -> JsString(user.lastName),
    "email" -> Json.toJson(user.email)
  ))
}

And you'd use it like this:

scala> User(1L, "Some", "Person", Some("[email protected]"))
res0: User = User(1,Some,Person,Some([email protected]))

scala> Json.toJson(res0)
res1: play.api.libs.json.JsValue = {"id":1,"firstName":"Some","lastName":"Person","email":"[email protected]"}

scala> res1.as[User]
res2: User = User(1,Some,Person,Some([email protected]))

See the documentation for more information.

like image 90
Travis Brown Avatar answered Oct 10 '22 17:10

Travis Brown