2016-10-18 6 views
0

Was würde ich gerne durch diese inspiriert tun: https://www.playframework.com/documentation/2.5.x/ScalaJsonHttpSlick Ergebnis JSon

Ich möchte Person haben, die Address mit ihnen verbunden haben. Es ist viel zu viele tatsächlich in meinem Beispiel, so dass eine Person mehrere Adressen haben kann und eine Adresse an mehrere Personen angehängt werden kann.

Die Abfrage war kein Problem. Ich bekomme zurück: Future[Seq[((Person, PersonAddress), Address)]] von der DB-Schicht.

Mein Problem beginnt, wenn ich das Ergebnis als json zurückgeben möchte. Für eine Person allein wäre es einfach, wie die Fallklasse schon vorsorgen würde, aber für eine solche Seq ist es komplizierter.

So habe ich versucht, dies:

1) DB kehrt nur Future[Seq[((Person, PersonAddress)]] für jetzt, die Dinge einfacher zu machen für mich

2) zu verstehen case class PersonWithPersonAddress(person: Person, personAddress: PersonAddress) hinzugefügt wurde ein Helfer zu sein, anstatt Tuple2[Person, PersonAddress]

der Verwendung

3) ich schrieb den folgenden Verfasser:

implicit val writes: Writes[PersonWithPersonAddress] = (
     (JsPath \ "person").write[Person], 
     (JsPath \ "personAddress").write[PersonAddress] 
    ) (unlift(PersonWithPersonAddress.unapply)) 

nach dem Compiler dies nicht enou ist gh.

Kein Json Serializer für Typ PersonAddress gefunden. Versuchen Sie ein implizites Schreiben oder Format für diesen Typ zu implementieren.

Dann habe ich versucht, hinzuzufügen: implicit val personFormat = Json.format[Person] implicit val PersonAddressFormat = Json.format[PersonAddress]

aber ich habe

(play.api.libs.json.OWrites[Person], play.api.libs.json.OWrites[PersonAddress]) does not take parameters

Ich ging von Hand zu meinem Writes[Person] schreiben, aber dies ist nicht etwas zu Json.format[Person] natürlich ändern .

Jetzt bin ich aus Ideen

Antwort

1

Dies sollte genug für Sie sein:

import play.api.libs.json.Json 

implicit val personFormat = Json.format[Person] 
implicit val personAddressFormat = Json.format[PersonAddress] 
implicit val personWithPersonAddressFormat = Json.format[PersonWithPersonAddress] 

Wenn Sie noch Writes Feld-für-Feld definieren wollen würde, sollten Sie dies versuchen:

import play.api.libs.functional.syntax._ 
import play.api.libs.json._ 

implicit val personWrites = Json.writes[Person] 
implicit val personAddressWrites = Json.writes[PersonAddress] 
implicit val personWithAddressWrites: Writes[PersonWithPersonAddress] = (
    (__ \ "person").write[Person] and 
    (__ \ "personAddress").write[PersonAddress] 
)(unlift(PersonWithPersonAddress.unapply)) 
+0

Ah, was ein bisschen ',' anstatt '' '' kann verursachen ... – Sorona