2014-05-08 13 views
26

Dato una stringa di JSON e una classe di casi che corrisponde ad esso, qual è un modo semplice per analizzare il JSON nella classe case? Ci sono molte librerie disponibili, ma sembra che Scala potrebbe ora farlo fuori dalla scatola.Scala: Analizza JSON direttamente in una classe di caso

Che dire se il JSON deve essere analizzato in un elenco della classe case?

UPDATE:

Jerkson sembra essere abbandonata, e non voglio installare il pieno Play o quadro di sollevamento o qualsiasi altra cosa pesante.

+0

Non è necessario installare i quadri pieni - si può semplicemente elencare la libreria JSON come una dipendenza. So che questo funziona per lift-json e spray-json, e probabilmente funziona anche per gli altri. – AmigoNico

risposta

14

Esistono diversi framework che possono farlo esattamente.

JSON4s

JSON4s è abbastanza maturo e supporta Jackson o un nativo JSON-Parser. Utilizzato in molti progetti per sostituire jerkson.

https://github.com/json4s/json4s

play-JSON

può essere utilizzato senza la pila gioco completo. Grande supporto come parte del progetto di gioco a dattiloscritto.

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

Scala-decapaggio

Un quadro serializzazione. C'è un'opzione per serializzare/deserializzare su JSON.

https://github.com/scala/pickling

Spray JSON

Può searialize e deserializzare. È necessario conoscere il numero di argomenti per la deserializzazione difficile.

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

0

Spray Json è abbastanza leggero e fa esattamente quello che ti serve. È un toolkit invece di un framework completo e puoi semplicemente importare il progetto Spray-json invece dell'intero progetto.

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

Gli esempi possono ottenere si imposta molto rapidamente. La maggior parte delle volte il codice da tradurre in/da JSON finisce per essere un liner, ma si ha la possibilità di gestirlo esplicitamente nel caso in cui si abbiano dei requisiti strani.

+1

Si noti che, mentre spray-json è un fulmine veloce per la ** serializzazione **, è insolitamente lento per ** deserializzazione **. [Anche gli autori ammettono che non è competitivo per la deserializzazione] (https://groups.google.com/forum/#!topic/spray-user/UAS8Bog5eWQ) (senza fare lavoro extra). –

+2

In realtà, le prestazioni di deserializzazione di Spray-Json sono migliorate con 1.3.0 https://groups.google.com/forum/#!msg/spray-user/oCKjHmUMDb0/pFZ5mJ0w9u4J – Onur

7

ho usato https://github.com/json4s/json4s, unica lamentela finora è 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

Questo problema è stato risolto. –

0

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

assicurarsi che la versione Scala corrisponde il vaso lift-JSON . Per es. per Scala 2.10 usa lift-json_2.10.

1

Usa spray-json quanto è piccolo.

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] 

Scarica spray-JSON in SBT utilizza questo build.sbt:

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