给定一个JSON字符串和一个与之对应的case类,将JSON解析为case类的简单方法是什么?有许多库可用,但似乎Scala现在可以开箱即用。
如果应该将JSON解析为案例类的列表呢?
更新:
Jerkson似乎被遗弃了,我不想安装完整的Play或Lift框架或其他任何重型框架。
答案 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和反序列化。需要知道反序列化的参数数量很难。
答案 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