Frage

Ich habe eine Reihe von Fallklassen, die ich zum Erstellen eines komplexen Objekts verwende Publisher.

sealed case class Status(status: String)
trait Running extends Status
trait Stopped extends Status


case class History(keywords: List[String], updatedAt: Option[DateTime])
case class Creds(user: String, secret: String)
case class Publisher(id: Option[BSONObjectID], name: String, creds: Creds, status: Status, prefs: List[String], updatedAt: Option[DateTime])

Ich möchte den Publisher mithilfe der Play-JSON-API in einen JSON-String konvertieren.ich benutzte Json.toJson(publisher) und es beschwerte sich darüber, dass es keins gab implicit für Publisher.Der Fehler verschwand, nachdem ich Folgendes angegeben hatte

implicit val pubWrites = Json.writes[Publisher]

Ausnahmsweise beschwert es sich nun darüber, dass keine Implizite für gefunden werden können Status, BSONObjectID and Creds.Wenn ich jedoch Implizite für jeden Status und jedes Guthaben bereitstelle, beschwert es sich immer noch.

implicit val statusWrites = Json.writes[Status]
implicit val credsWrites = Json.writes[Creds]

Irgendeine Idee, wie man das lösen kann?Dies ist das erste Mal, dass ich Play JSON verwende.Ich habe Json4s bereits zuvor verwendet und würde dies nach Möglichkeit mit Play JSON ausprobieren, bevor ich zu Json4s übergehe, es sei denn, es gibt klare Vorteile für die Verwendung/Nichtverwendung von Json4s gegenüber Play JSON.

War es hilfreich?

Lösung

Auch die Reihenfolge der Implizite ist wichtig.Vom Unwichtigsten zum Wichtigsten.Wenn Writes of Publisher Writes of Status erfordern, sollte das implizite for Writes of Status vor den Writes of Publisher stehen.

Hier ist der Code, den ich getestet habe, um zu funktionieren

import play.modules.reactivemongo.json.BSONFormats._
import play.api.libs.json._
import reactivemongo.bson._
import org.joda.time.DateTime


sealed case class Status(status: String)
trait Running extends Status
trait Stopped extends Status


case class History(keywords: List[String], updatedAt: Option[DateTime])
case class Creds(user: String, secret: String)
case class Publisher(id: Option[BSONObjectID], name: String, creds: Creds, status: Status, prefs: List[String], updatedAt: Option[DateTime])

implicit val statusWrites = Json.writes[Status]
implicit val credsWrites = Json.writes[Creds]
implicit val pubWrites = Json.writes[Publisher]

val p = Publisher(
Some(new BSONObjectID("123")), 
"foo",
Creds("bar","foo"),
new Status("foo"),
List("1","2"),
Some(new DateTime))

Json.toJson(p)
//res0: play.api.libs.json.JsValue = {"id":{"$oid":"12"},"name":"foo","creds":{"user":"bar","secret":"foo"},"status":{"status":"foo"},"prefs":["1","2"],"updatedAt":1401787836305}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top