Spray-json désérialisation des objets imbriqués
Comment désérialiser des objets imbriqués correctement en 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
Sur un côté-note, comment spray-json l'aide de la sérialisation d'une carte de champs (avec imbriqué carte pour les objets imbriqués)?
OriginalL'auteur user3103600 | 2014-02-11
Vous devez vous connecter pour publier un commentaire.
L'exemple ci-dessous montre JSON -> Arbre de Syntaxe Abstraite -> Scala Cas des Classes et à l'arrière avec des noms de champ personnalisé et de soutien pour facultatif cas, les membres de la classe. L'exemple est dérivée à partir de la pulvérisation-json de la documentation à https://github.com/spray/spray-json pour la version 1.2.5.
L'exemple des sorties suivantes lors de l'exécution:
Pouvez-vous me dire ce que vous avez déjà essayé? A été le spray json documentation utile?
Je veux personnaliser les noms de champ lors de la sérialisation.
J'ai supposé que vous étiez en train de jouer avec ce code pour comprendre spray-json, qui a été renforcé par votre question, "Comment désérialiser des objets imbriqués correctement en spray-json?". Je suggère à l'avenir vous utilisez des questions plus spécifiques. E. g., "J'ai les classes suivantes. Le code ne compile pas et produit le message d'erreur suivant... Pour être clair j'ai besoin de manipuler des valeurs null et que vous voulez utiliser des noms de champ personnalisé pour la sérialisation/désérialisation." Je vais mettre à jour la réponse maintenant, avec des noms de champ personnalisé et la gestion des valeurs null. Tout ce que je suis en train de faire est de lire les docs pour info.
La documentation est vraiment inutile. Spécialement pour Scala débutants. De toute façon, je vais essayer ce modèle et la marque, il a accepté. Merci
OriginalL'auteur Dave Swartz
À votre question - comment réutiliser JSON conversions à l'intérieur d'un type d'emballage:
Je voudrais le changer en:
De cette façon, vous laissez le
Person
classe de cas de JSONify lui-même, au lieu d'introduire une autre manière dans l'emballage de l'objet. SEC et plus simple.Et:
Utiliser le
.convertTo[Person]
ici:Si il y a des problèmes, veuillez demander de l'aide. J'ai même structure dans mon propre projet, mais n'essayez pas de les exécuter dans ce contexte.
OriginalL'auteur akauppi