2016-05-06 17 views
1

folgende Fallklasse Gegeben:Generieren von JSON mit Ausgabedaten

import java.time.LocalDate 
case class ReportDateVO(reportDate: LocalDate) 

Ich versuche, das implizite JSON-Format zu definieren:

implicit val reportDatesWrite : Writes[ReportDateVO] = (
     (JsPath \ "dt").write[LocalDate] 
) (unlift(ReportDateVO.unapply)) 

Aber ich erhalte den folgenden Fehler:

overloaded method value write with alternatives: (t: java.time.LocalDate)(implicit w: play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[play.api.libs.json.JsValue] (implicit w: play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[java.time.LocalDate] cannot be applied to (fdic.ReportDateVO ⇒ java.time.LocalDate)

Was sind diese Alternativen? Es gibt kein Standardformat? Wie behebt man das? Ich benutze Play 2.5.2.

Antwort

1

Die kurze Antwort ist, dass Sie nur 2 JSON combinators für Fallklassen mit minimaler Anzahl von Parametern verwenden können (bis 22). Sehen Sie sich die Dokumentation für JSON Reads/Writes/Format Combinators, Abschnitt Komplex liest. Die Kombinatoren arbeiten ähnlich für Lesen und Schreiben so kurze Erklärung in Complex Reads Abschnitt kann hilfreich sein. Also im Grunde Compiler, was sagt Ihnen ist, dass Sie nicht Typ Funktion von fdic.ReportDateVO ⇒ java.time.LocalDate dem Verfahren Schreib was irgendwie seltsam ist, weil logisch passieren kann, wenn Sie Klammern um die haben (JsPath \ "dt"). schreiben [LOCALDATE], die Instanz von OWrites zurückkehren sollte [LOCALDATE], der Compiler sollte etwa falschen anwenden Verfahren in Objekt vom Typ OWrites beschweren [LOCALDATE] .

Ich denke, die beste Alternative (wenn Sie benutzerdefinierten Filed Name haben möchten) ist zu implementieren schreibt [LocalDate] manuell.

implicit val reportDatesWrite: Writes[ReportDateVO] = OWrites[ReportDateVO] { 
    rdvo: ReportDateVO => Json.obj(
    "dt" -> DefaultLocalDateWrites.writes(rdvo.reportDate) 
) 
} 

Wenn Feldnamen den Namen des Parameters, falls Kategorie anzeigen lassen kann (reportDate), dann können Sie auch Play-Helfer-Methode verwenden, die Scala-Makros implementiert wird. überladene Methode Wert schreibt mit Alternativen:

implicit val reportDatesWrite: Writes[ReportDateVO] = Json.writes[ReportDateVO] 
+0

Wenn ich versuche, DefaultLocalDateWrites zu verwenden, erhalte ich eine Fehlermeldung, dass die Funktion nicht gefunden wird.Ich importiere play.api.libs.json._ enthält LocalWrites, irgendwelche Ideen? – ps0604

+0

Versuchen Sie es direkt zu importieren 'import play.api.libs.json.Writes.DefaultLocalDateWrites'. Es ist ein Teil von 'play.api.libs.json.DefaultWrites', das in das Begleitobjekt" play.api.libs.json.Writes "eingemischt ist. Oder importiere einfach alles 'play.api.libs.json.Writes._' – yahor

1

PlayJson bietet nur Serializer für Basistypen wie Int, String, Double - LocalDate gehört nicht dazu.

Sie haben die richtige Idee, brauchen aber präziser und definieren Combinator für LOCALDATE werden zuerst:

implicit val LocalDateWrites: Writes[LocalDate] = Writes { 
     (l: LocalDate) => JsString(l.toString()) 
    } 

    implicit val reportDatesWrite : Writes[ReportDateVO] = (
     (JsPath \ "dt").write[LocalDate] 
    ) (unlift(ReportDateVO.unapply)) 
+0

ich den gleichen Fehler in der reportDatesWrite bekommen (t: java.time.LocalDate) (impliziten w: play.api.libs.json.Writes [java.time .LocalDate]) play.api.libs.json.OWrites [play.api.libs.json.JsValue] (implizite w: play.api.libs.json.Writes [java.time.LocalDate]) play.api. libs.json.OWrites [java.time.LocalDate] kann nicht angewendet werden (fdic.ReportDateVO ⇒ java.time.LocalDate) – ps0604