我正在使用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库吗?
答案 0 :(得分:31)
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)
使用案例类提取值
implicit val formats = net.liftweb.json.DefaultFormats
case class Foo(foo: Bar)
case class Bar(bar: Int)
json.extract[Foo]
XPath样式
scala> val JInt(x) = json \ "foo" \ "bar"
x: BigInt = 10
非类型安全值
scala> json.values
res0: Map((foo,Map(bar -> 10)))
答案 1 :(得分:0)
以下是将原始字符串JSON反序列化为不同Scala 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)
}
以下是上述示例的依赖关系:
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"
)
这篇文章的灵感来自以下文章:A quick tour of JSON libraries in Scala