Spray-json Deserialisieren verschachtelte Objekt
Wie Deserialisieren verschachtelte Objekte korrekt in spray-json?
import spray.json._
case class Person(name: String)
case class Color(n: String, r: Int, g: Int, b: Int, p: Person)
object MyJsonProtocol extends DefaultJsonProtocol {
implicit object ColorJsonFormat extends RootJsonFormat[Color] {
def write(c: Color) = JsObject(
"color-name" -> JsString(c.n),
"Green" -> JsNumber(c.g),
"Red" -> JsNumber(c.r),
"Blue" -> JsNumber(c.b),
"person-field" -> JsObject("p-name" -> JsString(c.p.name))
)
def read(value: JsValue) = {
value.asJsObject.getFields("color-name", "Red", "Green", "Blue", "person-field") match {
case Seq(JsString(name), JsNumber(red), JsNumber(green), JsNumber(blue), JsObject(person)) =>
Color(name, red.toInt, green.toInt, blue.toInt, null) //gotta replace null with correct deserializer
case _ => throw new DeserializationException("Color expected")
}
}
}
}
import MyJsonProtocol._
val jsValue = Color("CadetBlue", 95, 158, 160, Person("guest")).toJson
jsValue.prettyPrint
val color = jsValue.convertTo[Color] //person is missing of course
Am Rande, wie spray-json helfen serialisieren, um eine Karte der Felder (mit geschachtelten anzeigen für verschachtelte Objekte)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beispiel unten demonstriert JSON -> Abstract Syntax Tree -> Scala Fall Klassen-und Rückseite mit benutzerdefinierten Feldnamen und Unterstützung für optionale Fall Klasse Mitglieder. Das Beispiel ist abgeleitet von dem spray-json-Dokumentation auf https://github.com/spray/spray-json für die version 1.2.5.
Beispiel liefert folgende Ausgabe, wenn Sie ausgeführt:
Color(name, red.toInt, green.toInt, blue.toInt, null) //gotta replace null with correct deserializer
ich muss wissen, die Art und Weise umgehen zu können "null" - Werte während der (de -) Serialisierung.Ihre verbleibenden Frage - wie die Wiederverwendung von JSON-Konvertierungen innerhalb einer Verpackung Typ:
Ich würde dies ändern:
Diese Weise lassen Sie die
Person
Fall Klasse JSONify sich, statt der Einführung einer anderen Art und Weise, in der Verpackung-Objekt. TROCKEN und einfacher.Und:
Verwenden Sie die
.convertTo[Person]
hier:Wenn es Probleme gibt, Fragen Sie bitte für weitere Hilfe. Ich habe ähnliche Struktur in mein eigenes Projekt, aber nicht versuchen, Sie zu laufen in diesem Zusammenhang.