在Scala中使用什么JSON库?

Dav*_*lla 118 json scala

我需要构建一个JSON字符串,如下所示:

[
  { 'id': 1, 'name': 'John'},
  { 'id': 2, 'name': 'Dani'}
]

val jArray = JsArray();
jArray += (("id", "1"), ("name", "John"))
jArray += (("id", "2"), ("name", "Dani"))
println(jArray.dump)
Run Code Online (Sandbox Code Playgroud)

我需要能够添加行jArray,比如jArray += ...

最近的图书馆/解决方案是什么?

Ale*_*ean 203

不幸的是,编写JSON库是Scala社区编写todo列表应用程序的版本.

有很多种选择.我没有特别的顺序列出它们,附注:

  1. parsing.json.JSON - 警告此库仅适用于Scala版本2.9.x(在较新版本中删除)
  2. spray-json - 从Spray项目中提取
  3. 杰克逊 - 警告一个不错的库(建立在Java杰克逊之上),但现在放弃了软件.如果你打算使用它,可以按照Scalding项目的例子使用backchat.io fork
  4. sjson - Debasish Ghosh
  5. lift-json - 可以与Lift项目分开使用
  6. json4s§ - 从lift-json中提取,它试图创建一个标准的JSON AST,其他JSON库可以使用它.包括杰克逊支持的实施
  7. Argonaut§ - 来自Scalaz背后的人的Scala面向FP的JSON库
  8. play-json ± - 现在可以单独使用,请参阅此答案以获取详细信息
  9. 第戎 - 警告被遗弃.动态类型的Scala JSON库
  10. sonofjson - 针对超简单API的JSON库
  11. Jawn - Erik Osheim的JSON图书馆旨在获得杰克逊或更快的速度
  12. Rapture JSON ± - 一个JSON前端,可以使用2,4,5,6,7,11或Jackson作为后端
  13. circe - Argonaut的叉子建立在而不是scalaz之上
  14. jsoniter-scala - 用于编译时生成超快JSON编解码器的Scala宏

§=有Scalaz集成,±=支持与Jackson的互操作 JsonNode

除雪机,我们使用与杰克逊后端json4s; 我们也和Argonaut有过很好的经历.

  • 并不是因为lift-json捆绑在更大的LIft项目中,你可以简单地依赖lift-json,而Lift项目中的任何其他内容都不会出现在你的项目中. (8认同)
  • @AlexDean:parsing.json.JSON有什么不好的? (3认同)
  • @BjornTipling - 好点,现在找不到它在2.11中被弃用了.删除了那条评论 (2认同)
  • 该列表应将[jackson-module-scala](https://github.com/FasterXML/jackson-module-scala)放在顶部,这在性能,简单性,维护和支持方面是迄今为止最好的。 (2认同)

fmp*_*ard 17

Lift-json的版本是2.6,它运行得非常好(并且也得到很好的支持,维护者随时准备修复用户可能发现的任何错误.你可以在github存储库中找到使用它的例子.

维护者(Joni Freeman)总是可以在Lift邮件列表中找到.邮件列表中还有其他用户也非常有帮助.

正如@Alexey指出的那样,如果您想将库与其他Scala版本一起使用2.11.x,请更改scalaVersion并使用%%如下:

scalaVersion := "2.11.5" 

"net.liftweb" %% "lift-json" % "2.6"
Run Code Online (Sandbox Code Playgroud)

您可以查看liftweb.net网站,了解随时间推移的最新版本.

  • 我也使用lift-json,并且可以保证它是一个很棒的图书馆.它使解析和生成/序列化JSON非常容易. (3认同)
  • 对于Scala 2.11:"net.liftweb"%"lift-json_2.11"%"2.6-M4" (2认同)

par*_*tic 15

我建议使用jerkson,它支持大多数基本类型转换:

scala> import com.codahale.jerkson.Json._

scala> val l = List( 
                 Map( "id" -> 1, "name" -> "John" ),
                 Map( "id" -> 2, "name" -> "Dani")
               )

scala> generate( l )

res1: String = [{"id":1,"name":"John"},{"id":2,"name":"Dani"}]
Run Code Online (Sandbox Code Playgroud)

  • 这个图书馆已被作者遗弃,有没有其他选择? (9认同)
  • 它还为case类提供了一些非常棒的支持,可以实现一些非常优雅的*和*类型安全的JSON处理. (2认同)

Ram*_*mon 10

名单上的第7名是杰克逊,不是杰克森.它支持Scala对象(案例类等).

以下是我如何使用它的示例.

object MyJacksonMapper extends JacksonMapper
val jsonString = MyJacksonMapper.serializeJson(myObject)
val myNewObject = MyJacksonMapper.deserializeJson[MyCaseClass](jsonString)
Run Code Online (Sandbox Code Playgroud)

这使得它非常简单.另外,XmlSerializer和对JAXB Annotations的支持非常方便.

这篇博文描述了它与JAXB Annotations和Play Framework的结合使用.

http://krasserm.blogspot.co.uk/2012/02/using-jaxb-for-xml-and-json-apis-in.html

这是我目前的JacksonMapper.

trait JacksonMapper {

  def jsonSerializer = {
    val m = new ObjectMapper()
    m.registerModule(DefaultScalaModule)
    m
  }

  def xmlSerializer = {
    val m = new XmlMapper()
    m.registerModule(DefaultScalaModule)
    m
  }

  def deserializeJson[T: Manifest](value: String): T = jsonSerializer.readValue(value, typeReference[T])
  def serializeJson(value: Any) = jsonSerializer.writerWithDefaultPrettyPrinter().writeValueAsString(value)
  def deserializeXml[T: Manifest](value: String): T = xmlSerializer.readValue(value, typeReference[T])
  def serializeXml(value: Any) = xmlSerializer.writeValueAsString(value)

  private[this] def typeReference[T: Manifest] = new TypeReference[T] {
    override def getType = typeFromManifest(manifest[T])
  }

  private[this] def typeFromManifest(m: Manifest[_]): Type = {
     if (m.typeArguments.isEmpty) { m.erasure }
     else new ParameterizedType {
       def getRawType = m.erasure

       def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray

       def getOwnerType = null
     }
  }
}   
Run Code Online (Sandbox Code Playgroud)


Ale*_*var 8

也许我已经晚了一点,但你真的应该尝试从play框架中使用json库.你可以查看文档.在当前的2.1.1版本中,如果没有整个游戏2,则无法单独使用它,因此依赖关系将如下所示:

val typesaferepo  = "TypeSafe Repo" at "http://repo.typesafe.com/typesafe/releases"
val play2 = "play" %% "play" % "2.1.1"
Run Code Online (Sandbox Code Playgroud)

它将为您带来所有东西的整体游戏框架.

但据我所知,Typesafe的人有计划在2.2版本中将其分开.所以,2.2-snapshot中有独立的play-json.

  • 仅供参考:Play的JSON库已在Typesafe快照回购中提供:http://repo.typesafe.com/typesafe/snapshots/com/typesafe/play/play-json_2.10/ (2认同)

eug*_*gen 5

你应该检查Genson.它只是工作,并且比Scala中的大多数现有替代品更容易使用.它很快,具有许多功能并与其他一些库(jodatime,json4s DOM api ...)集成.

所有这些都没有任何花哨的不必要的代码,如implicits,基本案例的自定义读者/编写者,由于操作员超载导致的错误API ...

使用它就像:

import com.owlike.genson.defaultGenson_

val json = toJson(Person(Some("foo"), 99))
val person = fromJson[Person]("""{"name": "foo", "age": 99}""")

case class Person(name: Option[String], age: Int)
Run Code Online (Sandbox Code Playgroud)

免责声明:我是Gensons的作者,但这并不是我不客观:)


Aka*_*all 5

这是使用编写然后读取json文件的基本实现json4s.

import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonDSL._
import java.io._
import scala.io.Source


object MyObject { def main(args: Array[String]) {

  val myMap = Map("a" -> List(3,4), "b" -> List(7,8))

  // writing a file 
  val jsonString = pretty(render(myMap))

  val pw = new PrintWriter(new File("my_json.json"))
  pw.write(jsonString)
  pw.close()

  // reading a file 
  val myString = Source.fromFile("my_json.json").mkString
  println(myString)

  val myJSON = parse(myString)

  println(myJSON)

  // Converting from JOjbect to plain object
  implicit val formats = DefaultFormats
  val myOldMap = myJSON.extract[Map[String, List[Int]]]

  println(myOldMap)
 }
}
Run Code Online (Sandbox Code Playgroud)