[英]What is the most straightforward way to parse JSON in Scala?
我正在使用Scala開發一個簡單的Web應用程序。 計划是從外部API獲取JSON數據,並將其插入到模板中(遺憾的是,以XML格式獲取數據不是一種選擇)。
我曾嘗試使用Twitter的scala-json庫,但我無法正確編譯(github上的代碼無法在sbt中更新,說標准項目7.10不可用,我還沒有解決這個問題)。
lift-json看起來令人印象深刻,但似乎比我現在需要的要復雜得多。
試圖導入我使用Java,jsonic的庫,導致各種神秘的錯誤。 這太糟糕了,因為我更喜歡簡潔的jsonic。
我在內置的scala.util.parsing.json.JSON方面取得了一些進展,但實際上我無法告訴如何訪問這些元素。 你可能已經注意到了,我對Scala有些新意。 如何訪問JSONObjects的屬性?
scala.util.parsing.json.JSON有很多信息,但有沒有關於如何在任何地方使用它的直接教程?
我真的只對目前對JSON進行反序列化,對Ints,Strings,Maps和Lists感興趣。 我不需要序列化對象或使反序列化的對象適合當前的類。
任何人都可以指出我使用上述庫之一的方法,或者幫助我設置一個可以滿足我想要的Java庫嗎?
Lift JSON提供了幾種不同類型的反序列化JSON。 每個都有其優點和缺點。
val json = JsonParser.parse(""" { "foo": { "bar": 10 }} """)
LINQ樣式查詢理解:
scala> for { JField("bar", JInt(x)) <- json } yield x
res0: List[BigInt] = List(10)
更多示例: http : //github.com/lift/lift/blob/master/framework/lift-base/lift-json/src/test/scala/net/liftweb/json/QueryExamples.scala
使用案例類提取值
implicit val formats = net.liftweb.json.DefaultFormats
case class Foo(foo: Bar)
case class Bar(bar: Int)
json.extract[Foo]
更多示例: https : //github.com/lift/lift/blob/master/framework/lift-base/lift-json/src/test/scala/net/liftweb/json/ExtractionExamples.scala
XPath風格
scala> val JInt(x) = json \ "foo" \ "bar"
x: BigInt = 10
非類型安全值
scala> json.values
res0: Map((foo,Map(bar -> 10)))
以下是將原始字符串JSON反序列化為不同Scala 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)
}
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)
}
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)
}
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)
}
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)
}
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)
}
以下是上述示例的依賴關系:
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"
)
這篇文章的靈感來自以下文章: Scala中JSON庫的快速瀏覽
相關的問題: 在Scala中使用什么JSON庫?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.