2010-11-12 43 views
17

Tôi đang làm việc trên một ứng dụng web đơn giản với Scala. Kế hoạch là lấy dữ liệu JSON từ một API bên ngoài và chèn nó vào một mẫu (không may, lấy dữ liệu trong XML không phải là một tùy chọn).Cách đơn giản nhất để phân tích cú pháp JSON trong Scala là gì?

Tôi đã thử làm việc với thư viện scala-json của Twitter, nhưng tôi không thể biên dịch đúng (mã trên github không cập nhật được trong sbt, nói rằng chuẩn 7.10 không có sẵn và tôi chưa làm việc đó ra được nêu ra).

lift-json trông ấn tượng, nhưng có vẻ phức tạp hơn tôi cần ngay bây giờ.

Đang cố gắng nhập thư viện tôi đã làm việc với Java, jsonic, dẫn đến nhiều lỗi phức tạp. Điều này là quá xấu bởi vì tôi thích cách jsonic đơn giản hơn.

Tôi đã thực hiện một chút tiến bộ với việc xây dựng trong scala.util.parsing.json.JSON, nhưng thực sự tôi không thể nói cách truy cập các phần tử. Tôi có phần mới với Scala, như bạn có thể đã lưu ý. Làm thế nào để bạn truy cập vào các thuộc tính của JSONObjects?

scala.util.parsing.json.JSON có nhiều thông tin, nhưng có hướng dẫn đơn giản về cách sử dụng địa chỉ này ở bất kỳ đâu không?

Tôi thực sự chỉ quan tâm đến việc deserializing JSON vào lúc này, thành Ints, Strings, Maps và Lists. Tôi không cần phải tuần tự hóa các đối tượng hoặc làm cho các đối tượng deserialized phù hợp với một lớp học vào lúc này.

Mọi người có thể chỉ cho tôi cách làm việc với một trong các thư viện nói trên hoặc giúp tôi thiết lập với một thư viện Java sẽ làm những gì tôi muốn không?

Trả lời

31

Nâng JSON cung cấp một số kiểu khác nhau của JSON deserializing. Mỗi người đều có ưu và khuyết điểm của họ.

val json = JsonParser.parse(""" { "foo": { "bar": 10 }} """) 

LINQ truy vấn hiểu phong cách:

scala> for { JField("bar", JInt(x)) <- json } yield x 

res0: List[BigInt] = List(10) 

Thêm ví dụ: http://github.com/lift/lift/blob/master/framework/lift-base/lift-json/src/test/scala/net/liftweb/json/QueryExamples.scala

giá trị Extract với trường hợp các lớp

implicit val formats = net.liftweb.json.DefaultFormats 
case class Foo(foo: Bar) 
case class Bar(bar: Int) 
json.extract[Foo] 

Thêm ví dụ: https://github.com/lift/lift/blob/master/framework/lift-base/lift-json/src/test/scala/net/liftweb/json/ExtractionExamples.scala

XPath phong cách

scala> val JInt(x) = json \ "foo" \ "bar" 

x: BigInt = 10 

Non-type giá trị an toàn

scala> json.values 

res0: Map((foo,Map(bar -> 10))) 
+0

Cũng có thể có được một này biên soạn, tôi nghĩ! Cảm ơn vì những lời khuyên. – JAL

0

Dưới đây là những ví dụ nhanh chóng của deserialising chuỗi nguyên JSON vào mô hình lớp trường hợp cho Scala khác nhau Thư viện JSON:

play-json

import play.api.libs.json._ 

case class User(id: Int, name: String) 

object User { 
    implicit val codec = Json.format[User] 
} 

object PlayJson extends App { 
    val string = """{"id": 124, "name": "John"}""" 
    val json = Json.parse(string) 
    val user = json.as[User] 
    println(user) 
} 

lift-json

import net.liftweb.json._ 

case class User(id: Int, name: String) 

object LiftJson extends App { 
    implicit val codec = DefaultFormats 
    val string = """{"id": 124, "name": "John"}""" 
    val json = parse(string) 
    val user = json.extract[User] 
    println(user) 
} 

spray-json

import spray.json._ 
import DefaultJsonProtocol._ 

case class User(id: Int, name: String) 

object UserJsonProtocol extends DefaultJsonProtocol { 
    implicit val codec = jsonFormat2(User) 
} 

object SprayJson extends App { 
    import UserJsonProtocol._ 
    val string = """{"id": 124, "name": "John"}""" 
    val json = string.parseJson 
    val user = json.convertTo[User] 
    println(user) 
} 

sphere-json

import io.sphere.json.generic._ 
import io.sphere.json._ 

case class User(id: Int, name: String) 

object SphereJson extends App { 
    implicit val codec = deriveJSON[User] 
    val string = """{"id": 124, "name": "John"}""" 
    val user = fromJSON[User](string) 
    println(user) 
} 

argonaut

import argonaut._ 
import Argonaut._ 

case class User(id: Int, name: String) 

object ArgonautJson extends App { 
    implicit def codec = casecodec2(User.apply, User.unapply)("id", "name") 
    val string = """{"id": 124, "name": "John"}""" 
    val user = string.decodeOption[User] 
    println(user) 
} 

circe

import io.circe.generic.auto._ 
import io.circe.parser._ 

case class User(id: Int, name: String) 

object CirceJson extends App { 
    val string = """{"id": 124, "name": "John"}""" 
    val user = decode[User](string) 
    println(user) 
} 

Dưới đây là phụ thuộc cho các ví dụ trên:

resolvers += Resolver.bintrayRepo("commercetools", "maven") 

libraryDependencies ++= Seq(

    "com.typesafe.play" %% "play-json"  % "2.6.7", 
    "net.liftweb"  %% "lift-json"  % "3.1.1", 
    "io.spray"   %% "spray-json"  % "1.3.3", 
    "io.sphere"   %% "sphere-json" % "0.9.0", 
    "io.argonaut"  %% "argonaut"  % "6.2", 
    "io.circe"   %% "circe-core"  % "0.8.0", 
    "io.circe"   %% "circe-generic" % "0.8.0", 
    "io.circe"   %% "circe-parser" % "0.8.0" 
) 

bài này được lấy cảm hứng từ bài viết sau đây: A quick tour of JSON libraries in Scala

liên quan SO câu hỏi: What JSON library to use in Scala?

+0

@ defghi1977 Vui lòng xem câu trả lời đã chỉnh sửa để nhận xét đánh giá địa chỉ. –

Các vấn đề liên quan