在Scala中解析JSON最直接的方法是什么?

JAL*_*JAL 18 serialization parsing json scala scala-2.8

我正在使用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库吗?

Jon*_*oni 31

Lift JSON提供了几种不同类型的反序列化JSON.每个都有其优点和缺点.

val json = JsonParser.parse(""" { "foo": { "bar": 10 }} """)
Run Code Online (Sandbox Code Playgroud)

LINQ样式查询理解:

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

res0: List[BigInt] = List(10)
Run Code Online (Sandbox Code Playgroud)

更多示例: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] 
Run Code Online (Sandbox Code Playgroud)

更多示例: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
Run Code Online (Sandbox Code Playgroud)

非类型安全值

scala> json.values

res0: Map((foo,Map(bar -> 10)))
Run Code Online (Sandbox Code Playgroud)