2014-05-08 22 views
26

Angesichts einer Zeichenfolge von JSON und einer entsprechenden Fallklasse, was ist eine einfache Möglichkeit, den JSON in die Fallklasse zu analysieren? Es gibt viele Bibliotheken, aber es scheint, dass Scala dies jetzt out-of-the-box tun könnte.Scala: Parse JSON direkt in eine Fallklasse

Wie wäre es, wenn der JSON in eine Liste der Fallklasse geparst werden soll?

UPDATE:

Jerkson scheint verlassen zu werden, und ich will nicht die volle spielen oder Aufzug Rahmen oder irgendetwas anderes schwer installieren.

+0

Sie müssen die volle Frameworks nicht installieren - Sie können einfach die json Bibliothek als Abhängigkeit Liste. Ich weiß, das funktioniert für Lift-Json und Spray-Json, und es funktioniert wahrscheinlich auch für andere. – AmigoNico

Antwort

14

Es gibt mehrere Frameworks, die genau das können.

JSON4s

JSON4s ist sehr ausgereift und unterstützt jackson oder einen nativen JSON-Parser. Benutzte es in vielen Projekten, um Jerkson zu ersetzen.

https://github.com/json4s/json4s

Play-json

Kann ohne die volle spielen Stapel verwendet werden. Tolle Unterstützung als Teil des Spielprojekts bei typesafe.

http://www.playframework.com/documentation/2.0/ScalaJson

Scala-Beiz-

A Serialisierung Framework. Es gibt eine Option zum Serialisieren und Deserialisieren von JSON.

https://github.com/scala/pickling

Spray JSON

searialize und deserialisieren kann. Sie müssen die Anzahl der Argumente für die Deserialisierung kennen.

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

0

Spray Json ist ziemlich leicht und macht genau das, was Sie brauchen. Es ist ein Toolkit anstelle eines Voll-On-Frameworks und Sie können einfach das Spray-Json-Projekt anstelle des gesamten Projekts importieren.

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

Die Beispiele können Sie sehr schnell eingerichtet bekommen. In den meisten Fällen ist Ihr Code für die Übersetzung in/aus JSON ein Liner, aber Sie haben die Möglichkeit, ihn explizit zu verwenden, falls Sie einige seltsame Anforderungen haben.

+1

Beachten Sie, dass, während Spray-Json blitzschnell für ** Serialisierung ** ist, es für ** Deserialisierung ** unbrauchbar langsam ist. [Selbst die Autoren geben zu, dass es für die Deserialisierung nicht wettbewerbsfähig ist] (https://groups.google.com/forum/#!topic/spray-user/UAS8Bog5eWQ) (ohne zusätzliche Arbeit zu leisten). –

+2

Tatsächlich wurde die Deserialisierungsleistung von Spray-Json mit 1.3.0 viel besser. Https://groups.google.com/forum/#!msg/spray-user/oCKjHmUMDb0/pFZ5mJ0w9u4J – Onur

7

I https://github.com/json4s/json4s, Haar in der Suppe nur so weit verwendet habe, ist 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] 
+1

Dieses Problem wurde behoben. –

0

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

die Scala Version des Lift-json Spiele jar Stellen Sie sicher, . Für Beispiel für Scala 2.10 benutze lift-json_2.10.

1

Verwenden Sie Spray-JSON, da es klein ist.

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] 

herunterladen Spray-json in sbt dieses build.sbt mit:

lazy val root = (project in file(".")). settings( name := "jsonExample", libraryDependencies += "io.spray" %% "spray-json" % "1.3.2" )