37

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でこれを行うベストプラクティスの方法はありますか?

4

5 に答える 5

39

Jacksonは、JSON を高速に処理するための Java ライブラリです。Jerkson プロジェクトは Jackson を包み込みますが、放棄されたようです。ネイティブ Scala データ構造へのシリアル化と逆シリアル化のために、Jackson の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 オプションには、Programming Scala book に基づくTwitter のscala-jsonが含まれます。これは単純ですが、パフォーマンスが犠牲になります。解析にparboiledを使用するSpray -jsonもあります。最後に、Play の JSON 処理は良さそうに見えますが、Play プロジェクトから切り離すのは簡単ではありません。

于 2013-01-05T00:04:06.400 に答える
7

長期的な解決策として、jackson、lift-json、または独自のネイティブ実装をラップするjson4s について言及します。

于 2013-03-05T02:12:40.907 に答える
4

Scala 2.10 をサポートする Jerkson のフォークがhttps://github.com/randhindi/jerksonにあります。

于 2013-03-17T08:46:55.447 に答える
2

したがって、エラー メッセージが表示されず、サンプル コードが正しくないことから、lift-json 抽出がどのように機能するかを理解していないことが原因であると考えられます。誤解した場合は、コメントしてお知らせください。それで、私が正しければ、ここにあなたが必要とするものがあります.

シリアル化するには:

import net.liftweb.json._
  import Extraction._

implicit val formats = DefaultFormats

case class Person(...)
val person = Person(...)
val personJson = decompose(person) // Results in a JValue

次に、プロセスを逆にするには、次のようにします。

// Person Json is a JValue here.
personJson.extract[Person]

それがあなたが問題を抱えている部分ではない場合は、私に知らせてください.

于 2012-10-01T03:23:09.530 に答える