Sans bruit, JSON traitement avec Scala
Je suis issu d'une dotnet terre, mais ont récemment été à la recherche sur les possibilités de remplacement des langages de programmation. Rien de bien grave, juste quelques bribes ici et là. Récemment, j'ai découvert Scala et je suis assez fasciné par elle. En dépit de la non-déterministe de bricolage, j'ai fait quelques intermédiaires des contrôles de substance qui est important pour moi en C# et je me sens plutôt satisfait: fonctionnel notions - tique, ad-hoc polymorphisme - tique, annotations - tique, de réflexion et de codegen - tique.
Maintenant, je suis en train de réfléchir comment programmer un analogue de JSON bibliothèque de traitement, j'ai implémenté en C# 4.0 avec l'aide de DLR et "dynamique" sucre syntaxique. Voici l'ensemble des fonctionnalités, je suis à la recherche de:
- Pratique de la navigation et de la construction des premières JSON.
- Conversion automatique entre JSON natif et objets de collections (dans sa forme générale, le problème est insoluble, si l'on peut définir des conventions qui va travailler 95% du temps - et c'est très bien pour moi).
Nouvelles fonctionnalités de C# 4.0 plutôt rock ici, car ils me permettent de remplacer l'accès des membres et le type jette à effectuer complètement la logique personnalisée (si une variable en C# 4.0 est de type "dynamique", alors tout ce que vous faites avec il sera compilé dans les appels de programmeur-méthodes définies avec suffisamment de comportement par défaut - voir DynamicMetaObject.BindXXX méthodes à MSDN pour plus d'info). E. g. J'ai changé de type de moulages de sérialiser/désérialiser .NET les objets et membre accède à gérer les premières JSON, de sorte que je peux écrire le code suivant:
var json = Json.Get("http://some.service");
if (json.foo) Console.WriteLine((Foo)json.foo);
json.bars = ((List<Bar>)json.bars).DoSomething();
Bien sûr, ce n'est pas l'idéal, car de liaison dynamique en C# 4.0 a des problèmes avec les méthodes d'extension et de l'inférence de type, et, en outre, le code se sent encore assez lourd. Mais de toute façon, c'est beaucoup mieux que l'aide de tous ceux ((JsonObject)json["quux"])["baz"] j'ai utilisé en c# 3.5.
De la recherche fondamentale montre que la Scala n'a pas consacré la langue fonctionnalités qui prennent en charge la liaison tardive. Cependant, il y a tellement de trucs que peut-être ils peuvent être utilisés ensemble pour créer un supportable émulation du code montré ci-dessus (ou même d'être mieux - je suis presque sûr que c'est possible). Pourriez-vous, s'il vous plaît, conseillez-moi quelque chose ici?
OriginalL'auteur Eugene Burmako | 2010-11-01
Vous devez vous connecter pour publier un commentaire.
Utile librairie JSON pour Scala est soulevez-json, qui est une composante autonome de l'Ascenseur Framework Web.
https://github.com/lift/framework/tree/master/core/json
Il prend en charge l'extraction de classes, l'analyse et DSL pour la création de JSON.
La page de a un didacticiel complet, donc je ne vais pas simplement copier et coller.
OriginalL'auteur tylerweir
Vous devriez vraiment avoir un coup d'oeil à sjson. Ici -> sjson sur github
Je suis en utilisant le Type de classe basée sur la mise en œuvre, dont vous pouvez consulter ici -> quelques exemples
Si vous avez une escapade à travers le code, il y a de vraiment intéressant scala astuces. Cela devrait vous donner ce que vous cherchez en ce qui concerne la #2. SJSON enveloppements d'expédition-json qui, je crois, permet l'intégration de soulevez-json (mentionné ci-dessus). Les deux dispatch-json/ascenseur-json devrait vous donner ce que vous recherchez dans le #1. Pour ce que sa vaut le coup j'ai été en utilisant sjson dans un projet de grande envergure et sa va à merveille. Et le monsieur derrière le projet a été assez étonnant et prend en charge le projet très bien.
OriginalL'auteur Vonn
J'ai flotté entre l'utilisation de
ascenseur-json
et de diverses variantes desjson
(par exemple dabasishg/sjson) et, plus récemment,Jerkson
(un Scala wrapper sur Jackson).Pour l'application de l'objet de la sérialisation et la désérialisation je continue à trouver
Jerkson
pour nécessiter le moins de peaufinage à faire un travail, par exemple, je viens de coder un simple objet de la sérialisation avec uncase class
qui ressemble à ceci:J'ai eu plusieurs erreurs avec les deux
lift-json
etsjson
maisjerkson
juste travaillé avec:et
OriginalL'auteur sroebuck
Comme d'autres l'ont souligné, il y a beaucoup de choix. Au-delà de celles mentionnées, la plupart des Java JSON bibliothèques de traitement devrait travailler avec Scala, trop, avec des niveaux variables de (dans)la commodité pour les non-Java JVM langues (comme Scala, Clojure, Groovy).
Ceux qui sont les plus puissants en termes de liaison de données sont Jackson, GSON et FlexJSON. Une possibilité est de les vérifier et voir si vous pouvez aider à améliorer l'interopérabilité -- Scala, par exemple, a un certain nombre de "exotiques" types de données qui pourraient bénéficier de la manipulation explicite (au-dessus et au-delà de la manipulation de la "norme" des objets java qui libs de soutien).
OriginalL'auteur StaxMan
Si vous voulez quelque chose de vraiment dynamique, à la scala, c'est ici: http://www.scala-lang.org/api/current/scala/Dynamic.html
Maintenant, c'est une fonctionnalité expérimentale, et pas aussi fort que le .NET DLR.
Casbah la scala-mongodb-pilote a essayé.
OriginalL'auteur iron9light
interestinly assez le code pour faire cela en scala, c'est bien plus en jeu que celle de Java.. aucune de ces réponses donner un bruit de solution gratuite comme le Java Jackson bibliothèque, sauf pour Jerkson qui s'enroule autour de Jackson.
ObjectMapper mapper = new ObjectMapper(); //can reuse, share globally
User user = mapper.readValue(new File("user.json"), User.class); //to parse
mapper.writeValue(new File("user-modified.json"), user); //to produce
OriginalL'auteur Ryan Medlin