Scala:将JSON直接解析为案例类

时间:2014-05-08 01:10:14

标签: json scala parsing scala-2.10 case-class

给定一个JSON字符串和一个与之对应的case类,将JSON解析为case类的简单方法是什么?有许多库可用,但似乎Scala现在可以开箱即用。

如果应该将JSON解析为案例类的列表呢?

更新:

Jerkson似乎被遗弃了,我不想安装完整的Play或Lift框架或其他任何重型框架。

7 个答案:

答案 0 :(得分:15)

有几个框架可以完全做到这一点。

<强> JSON4s

JSON4s非常成熟,支持 jackson 原生 JSON-Parser。在许多项目中用它来代替jerkson。

https://github.com/json4s/json4s

播放-JSON

可以在没有完整播放堆栈的情况下使用。作为类型安全游戏项目的一部分提供了很大的支持。

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

<强>的Scala-酸洗

序列化框架。可以选择序列化/反序列化为JSON。

https://github.com/scala/pickling

喷涂JSON

可以进行searialize和反序列化。需要知道反序列化的参数数量很难。

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

答案 1 :(得分:10)

我使用了https://github.com/json4s/json4s,到目前为止只有抱怨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]

答案 2 :(得分:1)

使用spray-json,因为它很小。

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]

使用此build.sbt将spray-json下载到sbt:

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

答案 3 :(得分:1)

对于任何第一次遇到这种情况的人,circe也是一个不错的选择

i <- 1

while (i < n_accounts) {

do_something()
Sys.sleep(900)
i <- i + 90000

}

答案 4 :(得分:0)

喷雾Json重量很轻,完全符合你的需要。它是一个工具包而不是完整的框架,您只需导入Spray-json项目而不是整个项目。

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

这些示例可以帮助您快速设置。大多数情况下,您转换为JSON或从JSON转换的代码最终都是一个衬里,但是如果您有一些奇怪的要求,您可以显式处理它。

答案 5 :(得分:0)

使用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版本与lift-json jar匹配。对于前者对于Scala 2.10,请使用lift-json_2.10。

答案 6 :(得分:0)

我是Play Framework中的JSON转换。

还要看看成熟的杰克逊。请注意,您需要使用Jackson Scala模块:https://github.com/FasterXML/jackson-module-scala

提供介绍的好文章 - 然后添加隐式转化的一些代码:https://coderwall.com/p/o--apg/easy-json-un-marshalling-in-scala-with-jackson