15

Sto provando a serializzare alcuni modelli relativamente semplici in json. Ad esempio, mi piacerebbe ottenere la rappresentazione JSON di:serializzare oggetti in 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("")) 
} 

ho bisogno di scrivere il mio Format [utente] con l'appropriato legge e scrive i metodi o c'è qualche altro modo? Ho guardato allo https://github.com/playframework/Play20/wiki/Scalajson ma sono ancora un po 'perso.

risposta

22

Sì, scrivendo la propria istanza Format è the recommended approach. Data la seguente classe, per esempio:

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

L'istanza potrebbe assomigliare a questo:

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

e desideri utilizzare in questo modo:

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

Vedi the documentation per ulteriori informazioni .

+0

Fantastico, grazie! E se volessi un Seq [utente] come Json? :) – LuxuryMode

+0

Play ha un'istanza per 'Seq', quindi puoi semplicemente usare' Json.toJson (users) .as [Seq [User]] '. –

+0

Usando Play 'JsNumber' con Mongo, ottengo un errore di serializzazione:' [errore] riproduzione - Impossibile richiamare l'azione, alla fine ha ricevuto un errore: java.lang.IllegalArgumentException: impossibile serializzare la classe scala.math.BigDecimal' –

6

Grazie al fatto utente è una classe caso si potrebbe anche fare qualcosa di simile:

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

senza scrivere il proprio formato [utente]. Si potrebbe fare lo stesso con legge:

implicit val userImplicitReads = Json.reads[User] 

io non l'ho trovato nella documentazione, ecco il link al api: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.Json $

+0

Solo per completezza - senza usare impliciti: 'Json.reads [Utente] .reads (myJson) .get' – Ixx

+0

Questo dovrebbe ora essere contrassegnato come la risposta. Ecco il link per il documento aggiornato: https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated –

Problemi correlati