【问题标题】:Deserializer for List[T] typesList[T] 类型的反序列化器
【发布时间】:2012-09-09 18:25:15
【问题描述】:

我正在尝试在使用 Scala 的 playframework 应用程序中将 JsArray 反序列化为 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")
  }
}

问题是我不知道如何使用它。欢迎任何帮助。

【问题讨论】:

  • 如果您不知道它是如何工作的,您是如何得出这是解决您的问题的方法的结论? Reads 的完全限定类名是什么,它是您自己的类之一还是库中的类?
  • Reads 是库中的一个类,用于将您的 JsValue 转换为 Tobject(Format)。这是我找到的例子(Here)

标签: json scala playframework playframework-2.0 deserialization


【解决方案1】:

这是一个简单的例子:

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] 成员,此方法也可以使用,例如:您只需在 reads 方法中使用 (json \ "xs").as[List[String]] 并在 writes 中使用 Json.toJson(foo.xs)

【讨论】:

  • 谢谢你成功了。我没想过那样使用我的 Format 实例。很高兴知道这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2013-11-20
相关资源
最近更新 更多