1

Scala を使用して、playframework アプリケーションで aJsArrayを aにデシリアライズしようとしています。List[T]いくつかの調査の後、必要な作業を行うはずのこの方法を見つけました。

/**
 * Deserializer for List[T] types.
 */
implicit def listReads[T](implicit fmt: Reads[T]): Reads[List[T]] = new Reads[List[T]] {
  def reads(json: JsValue) = json match {
    case JsArray(ts) => ts.map(t => fromJson(t)(fmt)).toList
    case _ => throw new RuntimeException("List expected")
  }
}

問題は、使い方がわからなかったことです。どんな助けでも大歓迎です。

4

1 に答える 1

3

簡単な例を次に示します。

scala> import play.api.libs.json._
import play.api.libs.json._

scala> Json.toJson(List(1, 2, 3)).as[List[Int]]
res0: List[Int] = List(1, 2, 3)

また、インスタンスを持つカスタム タイプがあるFormat場合:

case class Foo(i: Int, x: String)

implicit object fooFormat extends Format[Foo] {
  def reads(json: JsValue) = Foo(
    (json \ "i").as[Int],
    (json \ "x").as[String]
  )
  def writes(foo: Foo) = JsObject(Seq(
    "i" -> JsNumber(foo.i),
    "x" -> JsString(foo.x)
  ))
 }

それはまだ動作します:

scala> val foos = Foo(1, "a") :: Foo(2, "bb") :: Nil
foos: List[Foo] = List(Foo(1,a), Foo(2,bb))

scala> val json = Json.toJson(foos)
json: play.api.libs.json.JsValue = [{"i":1,"x":"a"},{"i":2,"x":"bb"}]

scala> json.as[List[Foo]]
res1: List[Foo] = List(Foo(1,a), Foo(2,bb))

このアプローチは、カスタム型にメンバーがある場合にも機能します。xs: List[String]たとえば(json \ "xs").as[List[String]]readsメソッドと.Json.toJson(foo.xs)writes

于 2012-09-17T15:00:30.643 に答える