Étant donné une chaîne de JSON et une classe de cas qui lui correspond, quel est un moyen simple d'analyser le JSON dans la classe de cas? Il existe de nombreuses bibliothèques disponibles, mais il semble que Scala pourrait maintenant le faire hors de la boîte.
Et si le JSON devait être analysé dans une liste de la classe de cas?
MISE À JOUR:
Jerkson semble être abandonné, et je ne veux pas installer le framework Play ou Lift complet ou quoi que ce soit d'autre lourd.
Il existe plusieurs cadres qui peuvent faire exactement cela.
circe
Beaucoup utilisé de nos jours. De nombreuses fonctionnalités intéressantes. Va attirer les chats.
https://circe.github.io/circe/https://github.com/circe/circe
JSON4s
JSON4s est assez mature et prend en charge jackson ou un natif JSON-Parser. Utilisé dans de nombreux projets pour remplacer jerkson.
https://github.com/json4s/json4s
play-json
Peut être utilisé sans la pile de jeu complète. Grand soutien dans le cadre du projet de jeu chez typesafe.
http://www.playframework.com/documentation/2.0/ScalaJson
Décapage à la scala
Un cadre de sérialisation. Il existe une option pour sérialiser/et désérialiser en JSON.
https://github.com/scala/pickling
Spray JSON
Peut marrialiser et désérialiser. Besoin de connaître le nombre d'arguments pour une désérialisation difficile.
J'ai utilisé https://github.com/json4s/json4s , seul le reproche jusqu'à présent est https://github.com/json4s/json4s/issues/137
import org.json4s._
import org.json4s.native.JsonMethods._
implicit val formats = DefaultFormats
case class ParsedPage(crawlDate: String, domain:String, url:String, text: String)
val js = """ {
"crawlDate": "20150226",
"domain": "0x20.be",
"url": "http://0x20.be/smw/index.php?title=99_Bottles_of_Beer&oldid=6214",
"text": "99 Bottles of Beer From Whitespace (Hackerspace Gent) Revision as of 14:43, 8 August 2012 by Hans ( Talk | contribs ) 99 Bottles of Beer Where: Loading map... Just me, with 99 bottles of beer and some friends. Subpages"
}"""
parse(js).extract[ParsedPage]
Pour toute personne se heurtant à cela pour la première fois, circe est également une bonne option
val customerJson = s"""{"id" : "1", "name" : "John Doe"}"""
case class Customer(id: String, name: String)
val customer = decode[Customer](customerJson)
Utilisez spray-json car il est petit.
import spray.json._
import DefaultJsonProtocol._
val json = """{"one" : "1", "two" : "2", "three" : "3"}""".parseJson
case class Numbers(one: String, two: String, three: String)
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val numbersFormat = jsonFormat3(Numbers)
}
import MyJsonProtocol._
val converted = json.convertTo[Numbers]
Téléchargez spray-json dans sbt en utilisant ce build.sbt:
lazy val root = (project in file(".")). settings( name := "jsonExample", libraryDependencies += "io.spray" %% "spray-json" % "1.3.2" )
Utilisez net.liftweb
import net.liftweb.json._
case class Detail(username:String, password:String)
implicit val formats = DefaultFormats
val input = parse(jsonString).extract[Detail]
println(input.username)
Assurez-vous que la version Scala correspond au pot lift-json. Par exemple pour Scala 2.10 utilisez lift-json_2.10.
Le Spray Json est assez léger et fait exactement ce dont vous avez besoin. C'est une boîte à outils au lieu d'un framework complet et vous pouvez simplement importer le projet Spray-json au lieu du projet entier.
https://github.com/spray/spray-json
Les exemples peuvent vous permettre de vous installer très rapidement. La plupart du temps, votre code à traduire vers/depuis JSON finit par être un liners, mais vous avez la possibilité de le gérer explicitement au cas où vous auriez des exigences étranges.
J'appuie la conversion JSON dans Play Framework.
Jetez également un œil à Jackson qui est mature. Notez que vous devrez utiliser Jackson Scala Module: https://github.com/FasterXML/jackson-module-scala .
Un article décent fournissant une introduction - puis du code pour ajouter des conversions implicites: https://coderwall.com/p/o--apg/easy-json-un-marshalling-in-scala-with-jackson