Lärm-freien JSON-format für die geschlossene Züge mit Spielen 2.2 Bibliothek
Ich brauche, um eine einfache JSON-Serialisierung Lösung mit minimalem Zeremonie. Also ich war ganz zufrieden das bevorstehende Play-2.2 Bibliothek. Dieser arbeitet perfekt mit dem einfachen Fall Klassen, z.B.
import play.api.libs.json._
sealed trait Foo
case class Bar(i: Int) extends Foo
case class Baz(f: Float) extends Foo
implicit val barFmt = Json.format[Bar]
implicit val bazFmt = Json.format[Baz]
Aber der folgende Fehler auf:
implicit val fooFmt = Json.format[Foo] //"No unapply function found"
Wie würde ich das angebliche fehlen extractor für Foo
?
Oder würden Sie empfehlen, alle anderen standalone-Bibliothek, die Griffe meinem Fall mehr oder weniger voll automatisch? I don ' T care ob das mit Makros zur compile-Zeit oder Reflexion zur Laufzeit, solange es funktioniert out of the box.
- Gibt es irgendein code fehlt? Ist das einzige, was die Definition
Foo
diesealed trait Foo
Linie? Was erwartest du, was passiert dann? Ich nehme anJson.format
würde die Arbeit für den regulären Klassen, wenn Sie haben eineapply()
undunapply()
Methode. - Spielen json, sowie heben json-sollte ok sein. Sehen Sie, Sie versuchen, ein format für ein Merkmal, aber fast alle Bibliotheken, die transparenten Serialisierung sind auf der Grundlage der case-Klassen. Nur use case-Klassen und pattern-matching, und Sie sollten in Ordnung sein.
- Ich muss in der Lage sein serialisiert Typ-Klassen. Deshalb brauche ich ein format für eine versiegelte Eigenschaft, die erweitert wird durch eine Anzahl von case-Klassen. Ist ein relativ häufiges Szenario.
- Die automatische
Json.format
scheint nicht möglich, mit Eigenschaften, aber Sie können schreiben Sie: stackoverflow.com/questions/14145432/... ; außerdem habe ich stolperte über diese Frage, die von Interesse sein könnten für Sie: stackoverflow.com/questions/6891393/... - Ich schrieb vor kurzem einen JSON-makro erzeugt, dass jackson code für jedes Objekt-Struktur mit der compile-Zeit-Typ-Informationen. Das makro ist in der Lage, erzeugen ein match-Anweisung für alle Subtypen eines geschlossenen Typ durch die reflection-api
knownDirectSubclasses
, sehen Sie hier: scala-lang.org/api/current/.... Ich kenne keine andere Json-Bibliothek, die das tut, aber... - tun Sie etwas dagegen, zu teilen, dass der code?
- Wenn Sie eine Woche warten, kann ich sehen, über wie es auf GitHub. Warnung: geschrieben wurde Es für unseren Anwendungsfall bei der Arbeit und nicht als generische Bibliothek.
- Kein problem. Ich habe auf halbem Weg geschrieben meine eigene Implementierung jetzt. Die
writer
schon läuft, noch einige Probleme zu beheben, mit singleton-Objekte in derreader
Teil. - je nach Ihren Zielen, können wir vielleicht unsere Kräfte vereinen
- Ja sicher, dies ist die-Projekt -- in der Tat, würde ich denken, dass dies sollte gezogen werden, in play-json schließlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine manuelle Umsetzung der
Foo
Begleiter Objekt:Prüfung:
Alternativ der direkte format-definition:
Jetzt idealerweise würde ich gerne automatisch generieren
apply
undunapply
Methoden. Es scheint, ich muss entweder Reflexion oder Tauchen Sie ein in Makros.case "Bar" => Json.fromJson[Bar](data)(barFmt)
aufgrund von Missverhältnis zum Tatsächlichen : JsValue[Bar] und Erwartet : JsValue[Foo]GEÄNDERT 2015-09-22
Die Bibliothek spielen-json-extra umfasst die spielen-json-Varianten Strategie, aber auch die [play-json-Erweiterungen] - Strategie (flach-string für den Fall, Objekte gemischt mit Objekten für den Fall, Klassen ohne zusätzliche $Variante $geben Sie, sofern erforderlich). Es bietet auch serialisierungsprogramme und deserializers für makramé basiert enums.
Vorherigen Antwort
Es ist jetzt eine Bibliothek namens spielen-json-Varianten, die Ihnen erlaubt, zu schreiben :
Generiert die entsprechenden Formate automatisch, es behandelt auch disambiguierung der folgende Fall, indem ein $ - Variante Attribut (das entspricht 0__ 's
class
Attribut)erzeugen würde
knownDirectSubclasses
nicht sicher, bereitgestellt durch das makro-system (und die Bestätigung, dass dies wird nicht, die behoben werden in absehbarer Zeit)AutoFormat[Foo](defaults = true)
knownDirectSubclasses
ist gebrochen, siehe 16) @ docs.scala-lang.org/overviews/macros/...Einen kleinen fix für die Vorherige Antwort durch 0__ bei der direkten format-definition - das liest-Methode hat nicht funktioniert, und hier ist mein umgestalten, um es zu auch zu mehr idiomatische -
Spielen 2.6 /2.7
Dies kann nun elegant mit spielen-json-derived-codecs
Fügen Sie einfach diese:
Sehen Sie hier das ganze Beispiel: ScalaFiddle