web-dev-qa-db-fra.com

Scala: analyser JSON directement dans une classe de cas

É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.

34
SRobertJames

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.

https://github.com/spray/spray-json

19
Andreas Neumann

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]
10
dranxo

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)
1
Rjk

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" )

1
Walker Rowe

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.

0
saket

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.

0
Gangstead

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

0
Adrian