json - Scala 2.10 + Json 序列化和反序列化

Scala 2.10 似乎已经破坏了一些旧的库(至少目前是这样),比如 Jerkson 和 lift-json。

目标可用性如下:

case class Person(name: String, height: String, attributes: Map[String, String], friends: List[String])

//to serialize
val person = Person("Name", ....)
val json = serialize(person)

//to deserialize
val sameperson = deserialize[Person](json)

但我很难找到适用于 Scala 2.10 的生成和反序列化 Json 的现有良好方法。

在 Scala 2.10 中有最佳实践方法吗?

最佳答案

Jackson是一个快速处理 JSON 的 Java 库。 Jerkson 项目包含了 jackson ,但似乎被放弃了。我已经切换到 jackson 的 Scala Module用于对原生 Scala 数据结构进行序列化和反序列化。

要获得它,请在您的 build.sbt 中包含以下内容:

libraryDependencies ++= Seq(
  "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.1.3",
   ...
)

然后您的示例将使用以下 Jackson 包装器逐字运行(我从 jackson-module-scala 测试文件中提取它):

import java.lang.reflect.{Type, ParameterizedType}
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.`type`.TypeReference;

object JacksonWrapper {
  val mapper = new ObjectMapper()
  mapper.registerModule(DefaultScalaModule)
  
  def serialize(value: Any): String = {
    import java.io.StringWriter
    val writer = new StringWriter()
    mapper.writeValue(writer, value)
    writer.toString
  }

  def deserialize[T: Manifest](value: String) : T =
    mapper.readValue(value, typeReference[T])

  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.runtimeClass }
    else new ParameterizedType {
      def getRawType = m.runtimeClass
      def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray
      def getOwnerType = null
    }
  }
}

其他 Scala 2.10 JSON 选项包括 Twitter 的 scala-json基于 Programming Scala 书——它很简单,但以性能为代价。还有spray-json , 它使用 parboiled用于解析。最后,Play's JSON handling看起来不错,但它并不容易与 Play 项目解耦。

https://stackoverflow.com/questions/12591457/

相关文章:

json - 为什么 RestTemplate 不将响应表示绑定(bind)到 PagedResou

java - 如何在 Gson 序列化中保持字段顺序

javascript - D3.js:使用图像(在数据中指定文件名)作为轴上的刻度值

javascript - 如何使用 JSON.NET 通过 ASP.NET MVC 传递 JSON

python - 从文本文件中检索变量值的最佳方法?

sql - Postgresql 中的 `->>` 和 `->` 有什么区别?

ruby-on-rails-3 - 如何使用 ActiveModel::Serializers 为同

javascript - 有没有一种快速的方法可以在文本编辑器中将 JavaScript 对象转换为

java - Jackson - 反序列化 JSON 字符串 - TypeReference 与 T

java - Jackson @JsonProperty(required=true) 不会抛出异常