15

Ich versuche, einige relativ einfache Modelle in JSON zu serialisieren. Zum Beispiel würde Ich mag die json Darstellung erhalten:Serialisierung von Objekten zu JSON mit 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("")) 
} 

ich mein eigenes Format schreiben muß [User] mit dem entsprechenden Lese- und Schreibmethoden oder gibt es eine andere Möglichkeit? Ich habe mir https://github.com/playframework/Play20/wiki/Scalajson angesehen, aber ich bin immer noch ein bisschen verloren.

Antwort

22

Ja, Ihre eigene Format Instanz ist the recommended approach. In Anbetracht der folgende Klasse, zum Beispiel:

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

Die Instanz könnte wie folgt aussehen:

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

Und du würdest es wie folgt verwendet werden:

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

Siehe the documentation für weitere Informationen .

+0

Fantastisch, danke! Und wenn ich einen Seq [User] als Json wollte? :) – LuxuryMode

+0

Play kommt mit einer Instanz für 'Seq', so dass Sie einfach' Json.toJson (users) .as [Seq [User]] 'verwenden können. –

+0

Ich benutze Play 'JsNumber' mit Mongo, bekomme ich einen Serialisierungsfehler:' [error] play - Kann die Aktion nicht aufrufen, bekam schließlich einen Fehler: java.lang.IllegalArgumentException: Klasse kann nicht serialisiert werden scala.math.BigDecimal' –

6

Dank der Tatsache User ist ein Fall Klasse, die Sie auch so etwas tun könnte:

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

ohne Ihr eigenes Format schreiben [Benutzer]. Sie könnten das gleiche tun mit lautet:

implicit val userImplicitReads = Json.reads[User] 

ich es nicht in der Dokumentation gefunden haben, hier der Link zum api ist: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.Json $

+0

Nur zur Vollständigkeit - ohne implicits: 'Json.reads [Benutzer] .reads (myJson) .get' – Ixx

+0

Dieser sollte jetzt als die Antwort markiert werden. Hier ist der Link für das aktualisierte Dokument: https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated –