131 votes

Librairie JSON pour Scala

Scala a une valeur par défaut de la bibliothèque JSON. http://www.scala-lang.org/api/current/index.html#scala.util.parsing.json.JSON$

Dois-je l'utiliser, ou d'une autre comme lift1.0? comment ils se comparent à ceux des bibliothèques de la base?

J'ai besoin de construire une chaîne JSON, quelque chose comme ceci:

[
  { 'id': 1, 'name': 'John'},
  { 'id': 2, 'name': 'Dani'}
]

val jArray = JsArray();
jArray += (("id", "1"), ("name", "John"))
jArray += (("id", "2"), ("name", "Dani"))
println(jArray.dump)

J'ai besoin d'être en mesure d'ajouter des lignes à la jArray, quelque chose comme jArray += ...

Ce qui est le plus proche de la bibliothèque/solution?

241voto

Alex Dean Points 3997

Malheureusement, l'écriture d'une librairie JSON est de la Scala de la communauté de la version de codage d'un todo liste app.

Il existe toute une variété de solutions de rechange. J'en fais la liste dans aucun ordre particulier, avec des notes:

  1. de l'analyse.json.JSON - Avertissement de la bibliothèque intégrée, mais peu de gens l'utiliser
  2. spray-json - Extraites à partir de la Pulvérisation de projet
  3. Jerkson ± - Avertissement , une belle bibliothèque (construite sur le toit de Java Jackson) mais maintenant abandonware. Si vous allez utiliser cela, probablement suivre les Brûlures du projet exemple et utiliser le backchat.io fourche
  4. sjson Par Debasish Ghosh
  5. soulevez-json - Peut être utilisé séparément de l'Ascenseur de projet
  6. json4s § ± - Une extraction de l'ascenseur-json, qui est d'essayer de créer un standard JSON AST qui d'autres JSON, les bibliothèques peuvent utiliser. Comprend un Jackson adossés à la mise en œuvre
  7. Argonaut § - UN FP-orienté librairie JSON pour la Scala, de la population derrière Scalaz
  8. jouer-json ± - Maintenant disponible séparément, voir cette réponse pour plus de détails
  9. dijon - typées dynamiquement Scala librairie JSON (aujourd'hui abandonné)
  10. sonofjson - JSON traitement aussi simple qu'on peut éventuellement faire en Scala
  11. Ravissement JSON - un élégant JSON front-end avec beaucoup de fonctionnalités, pour une variété de backend analyseurs/ASTs
  12. Jawn - très rapide en librairie JSON par Erik Osheim

§ = a Scalaz intégration, ± = prend en charge l'interopérabilité avec les Jackson JsonNode

17voto

fmpwizard Points 1673

Soulevez-json est à la version 2.6 M2 et il fonctionne vraiment bien (et qui est aussi très bien pris en charge, le responsable est toujours prêt à corriger tous les bugs les utilisateurs peuvent trouver. Vous pouvez trouver des exemples de l'utiliser sur le dépôt github

Le responsable (Joni Freeman) est toujours accessible sur l' Ascenseur mailing liste. Il y a aussi d'autres utilisateurs sur la liste de diffusion qui sont très utiles.

@Alexey, si vous utilisez Scala 2.11.x, vous pouvez utiliser

"net.liftweb" % "lift-json_2.11" % "2.6-M4

Vous pouvez vérifier la liftweb.net site pour trouver la version la plus récente comme le temps passe.

16voto

paradigmatic Points 20871

Je suggère d’utiliser jerkson, il prend en charge les conversions de type plus simple :

12voto

Ramon Points 53

Le numéro 7 sur la liste est de Jackson, en n'utilisant pas Jerkson. Il a un support pour Scala objets (classes, etc).

Ci-dessous est un exemple de la façon dont je l'utilise.

object MyJacksonMapper extends JacksonMapper
val jsonString = MyJacksonMapper.serializeJson(myObject)
val myNewObject = MyJacksonMapper.deserializeJson[MyCaseClass](jsonString)

Cela rend très simple. En plus, il est le XmlSerializer et de soutien pour les Annotations JAXB est très pratique.

Ce blog décrit l'utilisation avec des Annotations JAXB et le Cadre.

http://krasserm.blogspot.co.uk/2012/02/using-jaxb-for-xml-and-json-apis-in.html

Ici est mon JacksonMapper.

trait JacksonMapper {

  def jsonSerializer = {
    val m = new ObjectMapper()
    m.registerModule(DefaultScalaModule)
    m
  }

  def xmlSerializer = {
    val m = new XmlMapper()
    m.registerModule(DefaultScalaModule)
    m
  }

  def deserializeJson[T: Manifest](value: String): T = jsonSerializer.readValue(value, typeReference[T])
  def serializeJson(value: Any) = jsonSerializer.writerWithDefaultPrettyPrinter().writeValueAsString(value)
  def deserializeXml[T: Manifest](value: String): T = xmlSerializer.readValue(value, typeReference[T])
  def serializeXml(value: Any) = xmlSerializer.writeValueAsString(value)

  private[this] def typeReference[T: Manifest] = new TypeReference[T] {
    override def getType = typeFromManifest(manifest[T])
  }

  private[this] def typeFromManifest(m: Manifest[_]): Type = {
     if (m.typeArguments.isEmpty) { m.erasure }
     else new ParameterizedType {
       def getRawType = m.erasure

       def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray

       def getOwnerType = null
     }
  }
}   

8voto

Alex Povar Points 1236

Je suis peut-être la fin un peu, mais vous devriez vraiment essayer d'utiliser json bibliothèque de play framework. Vous pouvez consulter la documentation. Dans l'actuelle version 2.1.1 vous ne pouviez pas séparément l'utiliser sans jouer 2, de sorte dépendance ressemble à ceci:

val typesaferepo  = "TypeSafe Repo" at "http://repo.typesafe.com/typesafe/releases"
val play2 = "play" %% "play" % "2.1.1"

Il vous apportera toute la pièce-cadre avec tous les trucs à bord.

Mais comme je sais les gars de Typesafe avoir un plan pour le séparer en version 2.2. Donc, il est autonome play-json à partir de 2.2-instantané.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X