Bruit gratuit format JSON pour les scellés des traits Jouer 2.2 bibliothèque
J'ai besoin d'obtenir un simple sérialisation JSON solution avec un minimum de cérémonie. J'ai donc été très heureux de trouver ce prochain Jeu 2.2 bibliothèque. Cela fonctionne parfaitement avec la plaine des classes de cas, par exemple,
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]
Mais la suivante échoue:
implicit val fooFmt = Json.format[Foo] //"No unapply function found"
Comment puis-je configurer le prétendu manque d'extracteur pour Foo
?
Ou voulez-vous recommander de toute autre bibliothèque autonome qui s'occupe de mon cas, plus ou moins complètement automatiquement? Je ne m'inquiète pas de savoir si c'est avec des macros au moment de la compilation ou de réflexion au moment de l'exécution, tant qu'il fonctionne hors de la boîte.
- Est-il un code manquant? Est la seule chose que la définition de
Foo
lasealed trait Foo
ligne? Qu'attendez-vous d'arriver, alors? Je suppose queJson.format
pourrait fonctionner pour les classes ordinaires si elles ont unapply()
etunapply()
méthode. - Jouer json, ainsi que ascenseur json devrait être ok. Vous voyez, vous essayez d'obtenir un format d'un trait, mais presque toutes les bibliothèques qui fournissent des transparents de sérialisation sont basés sur les classes de cas. Juste en cas d'utilisation des classes et le pattern matching et vous devriez être bien.
- J'ai besoin d'être en mesure de sérialiser les classes de type. Donc j'ai besoin d'un format pour un scellé trait qui est prolongée par un certain nombre de classes de cas. Devrait être assez scénario.
- L'automatique
Json.format
ne semble pas possible avec les traits, mais vous pouvez leur écrire: stackoverflow.com/questions/14145432/... ; aussi, j'ai trébuché à travers cette question, qui pourrait être d'intérêt pour vous: stackoverflow.com/questions/6891393/... - J'ai récemment écrit un JSON macro qui génère jackson code pour toute la structure de l'objet à l'aide de la compilation des informations de type. La macro est en mesure de générer un match de déclaration pour tous les sous-types d'un type scellé par le biais de l'api reflection
knownDirectSubclasses
, vu ici: scala-lang.org/api/current/.... Je ne connais pas d'autre librairie Json qui fait cela, et pourtant... - avez-vous l'esprit de partage de code?
- Si vous pouvez attendre une semaine, je peux voir à propos de le faire sur GitHub. Avertissement: Il a été écrit pour notre cas d'utilisation au travail et non pas comme générique de la bibliothèque.
- Pas de problème. J'ai écrit à mi-chemin de ma propre mise en œuvre dès maintenant. Le
writer
fonctionne déjà, encore quelques problèmes à résoudre avec les objets singleton dans lareader
partie. - en fonction de vos objectifs, nous pouvons peut-être combiner les forces de
- Oui, bien sûr, projet -- en effet, je pense que ce doit être tiré en jeu-json par la suite.
Vous devez vous connecter pour publier un commentaire.
Voici un manuel de mise en œuvre de la
Foo
compagnon de l'objet:De vérification:
Sinon directe de la définition du format:
Maintenant idéalement, je voudrais générer automatiquement le
apply
etunapply
méthodes. Il semble que j'ai besoin d'utiliser la réflexion ou de la plongée dans les macros.case "Bar" => Json.fromJson[Bar](data)(barFmt)
en raison de l'inadéquation au Réel : JsValue[Bar] et Attendu : JsValue[Foo]MODIFIÉ 2015-09-22
La bibliothèque jouer-json-extra comprend la jouer-json-variantes stratégie, mais aussi la [play-json-extensions] stratégie (chaîne de télévision pour le cas des objets mélangés avec des objets pour les classes de cas sans supplément de $variante ou $type, sauf si nécessaire). Il fournit également sérialiseurs et deserializers pour macramé en fonction des enums.
Réponse précédente
Il y a maintenant une bibliothèque appelée jouer-json-variantes qui vous permet d'écrire :
Cela va générer le correspondant formats automatiquement, il permettra également de gérer l'ambiguïté du cas suivant en ajoutant un $variante de l'attribut (l'équivalent de 0__ 's
class
attribut)serait de générer des
knownDirectSubclasses
pas en toute sécurité fournis par le système de macro (et la confirmation que ce sera le pas être fixé tout moment bientôt)AutoFormat[Foo](defaults = true)
knownDirectSubclasses
est cassé, voir 16) @ docs.scala-lang.org/overviews/macros/...Un petit correctif pour la réponse précédente par 0__ au sujet de la directe de la définition de format - le lit de la méthode n'a pas fonctionné, et voici mon refactoriser, à le aussi devenue plus idiomatiques -
Jouer 2.6 /2.7
Ce qui peut être fait maintenant élégamment avec jouer-json-dérivés-codecs
Juste ajouter ceci:
Voir ici pour l'ensemble de l'exemple: ScalaFiddle