15

Estoy tratando de serializar algunos modelos relativamente simples en JSON. Por ejemplo, me gustaría obtener la representación JSON de:objetos serialización de JSON con play.api.libs.json

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

¿Tengo que escribir mi propio formato [usuario] con la adecuada lee y escribe los métodos o hay alguna otra manera? Miré https://github.com/playframework/Play20/wiki/Scalajson pero aún estoy un poco perdido.

Respuesta

22

Sí, escribir su propia Format instancia es the recommended approach. Dada la siguiente clase, por ejemplo:

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

La instancia podría tener este aspecto:

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) 
)) 
} 

y que le utilizar de esta manera:

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])) 

Ver the documentation para más información .

+0

fantástico, gracias! ¿Y si quisiera un Seq [Usuario] como Json? :) – LuxuryMode

+0

Juego viene con una instancia de 'Seq', por lo que sólo se puede utilizar Json.toJson (usuarios) .como' [SEC [usuario]] '. –

+0

Uso de 'JsNumber' a jugar con Mongo, me sale un error de serialización:' [error] jugar - No se puede invocar la acción, al final conseguimos un error: java.lang.IllegalArgumentException: no se puede serializar scala.math.BigDecimal' clase –

6

gracias al hecho de usuario es una clase de caso también se podría hacer algo como esto:

implicit val userImplicitWrites = Json.writes[User] 
val jsUserValue = Json.toJson(userObject) 

sin escribir su propio formato [usuario]. Usted podría hacer lo mismo con lee:

implicit val userImplicitReads = Json.reads[User] 

no he encontrado en la documentación, aquí está el enlace a la API: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.Json $

+0

Sólo por completo - sin usar implícitos: 'Json.reads [usuario] .reads (myJson) .get' – Ixx

+0

Ésta ahora debe marcarse como la respuesta. Aquí está el enlace para el documento actualizado: https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated –

Cuestiones relacionadas