2014-05-08 17 views
26

Bir JSON dizesi ve buna karşılık gelen bir sınıf sınıfı verildiğinde, JSON'u sınıf sınıfına ayırmanın basit bir yolu nedir? Çok sayıda kütüphane var, ancak Scala'nın bunu kutudan çıkartabileceği görünüyor.Scala: JSON'u bir sınıf sınıfına doğrudan ayrıştırın

JSON, vaka sınıfının bir listesine ayrıştırılmalı mı?

GÜNCELLEME:

Jerkson terkedilmiş görünüyor ve tam Çal veya Kaldırma çerçevesini veya ağır başka bir şey yüklemek istemiyorum.

+0

Tam çerçeveler yüklemek gerekmez - sadece bir bağımlılık olarak json kütüphanesi listeleyebilirsiniz. Bu işi lift-json ve spray-json için biliyorum ve muhtemelen başkaları için de çalışıyor. – AmigoNico

cevap

14

Tam olarak bunu yapabilecek birkaç çerçeve var.

JSON4s

JSON4s oldukça olgun ve jackson veya yerli JSON-Ayrıştırıcı destekler. Jerkson'u değiştirmek için birçok projede kullanıldı.

https://github.com/json4s/json4s

play-json

tam oyun yığını olmadan kullanılabilir. Playafe'de oyun projesinin bir parçası olarak büyük destek.

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

bir seri Çerçeve Scala-Paklama. JSON'a serileştirme/serileştirme seçeneği vardır.

https://github.com/scala/pickling

Sprey JSON

searialize ve serisini Can. Deserialization zor için argüman sayısını bilmek gerekiyor. Ben https://github.com/json4s/json4s kullandım

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

0

Sprey Json oldukça hafiftir ve tam olarak ihtiyacınız olanı yapar. Çerçevenin tamamı yerine bir araç takımıdır ve tüm proje yerine sadece Spray-json projesini alabilirsiniz.

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

örnekler çok hızlı kurmak alabilirsiniz. Çoğu zaman, JSON'a/JSON'dan çeviri yapmak için bir kod yazmanız yeterlidir, ancak bazı garip gereksinimleriniz olması durumunda bunu açık bir şekilde halledebilirsiniz.

+1

Dikkat edin, spray-json ** seri hale getirme ** için hızlı bir yıldırım olsa da, ** serileştirme ** için oldukça yavaştır. [Yazarlar bile, seri hale getirme için rekabetçi olmadığını itiraf ediyorlar] (https://groups.google.com/forum/#!topic/spray-user/UAS8Bog5eWQ) (ekstra çalışma yapmadan). –

+2

Aslında, Spray-Json'ın serileştirme performansı 1.3.0 https://groups.google.com/forum/#!msg/spray-user/oCKjHmUMDb0/pFZ5mJ0w9u4J – Onur

7

, sadece sızlanma şimdiye kadar olduğu 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

ile daha da iyiydi. Bu sorun düzeltildi. –

0

Kullanım 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) 

Scala versiyonu asansör-json kavanoz aynı olduğundan emin olun . Örn. Scala 2.10 için lift-json_2.10 kullanın.

1

Spray-json'u küçük olduğundan kullanın. Bu build.sbt kullanarak sbt içine

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] 

İndir sprey json: Çal Çerçevede

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

İlgili konular