我试图反序列化JsArrayList[T]使用Scala的一个playframework应用。 经过一些研究,我发现这个方法应该做了所需的工作:

/**
 * 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")
  }
}

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

#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

  ask by Marouane Lakhal translate from so

未解决问题?本站智能推荐:

1回复

如何使Reads [T]成为可选值

我的JSON中有一个名为“名称”的字段。 有三种状态可能是: 空/未定义 一个空字符串 非空字符串 我希望它作为Option [NonEmptyString]从序列化程序中出来 我实现了Reads [NonEmptyString],它读取一个字符串(最小
2回复

FlexJSON无法反序列化日期

我正在使用FlexJSON,并且无法从int解析Date对象。 我正在尝试使用JSONDeserializer,如下所示: 而json的价值是: 除非出生日期( dob键)值在1969年12月7日到1970年1月25日(或-2138400000到2095200000,以毫秒为单
1回复

在Play 2.0中从JSON反序列化回joda DateTime

我想不通魔术字,以允许在我的应用程序中为DateTime字段发布JSON。 查询时, DateTime从纪元开始以毫秒为单位返回。 当我尝试以该格式发布时( {"started":"1341006642000","task":{"id":1}} ),我得到了“无效值:开始”。 我还尝试
2回复

如何编写Scala Play框架自定义类的多个JSON序列化器反序列化器?

我有以下课程需要序列化解串器 我有多个构造函数的用户案例类。 这样用户可以创建为 var u =新用户(mid,mname,memail,mpassword) var u =新用户(mid,mname) 我期望JSON请求为 JSON请求类型1:-
1回复

如何使用Play API反序列化JSON数组

我有一个字符串,它是两个对象的Json数组。 我想使用Play Json库对其进行反序列化,并创建从键值到对象的映射。 如何编写deserializeJsonArray函数? 这似乎应该很容易,但我无法从Play文档或REPL中找到它。
1回复

如何玩和Joda:如何通过Scala序列化和反序列化DateTime?

我正在使用Play 2.3.7,Scala版本2.11.4。 我有这种课。 我想序列化和反序列化对象到json和从json到对象。 阅读文档后,我发现自己需要隐式的读写器。 所以我尝试如下: (unlift(Person.unapply)) 我收到编译器错误:重
1回复

在scala中播放json:反序列化json,忽略未知字段

我有一个要解析为case类的JSON响应。 但是我只关心来自JSON的某些字段子集。 例如:JSON返回{id:XYZ,名称:ABC,... //更多字段}我只关心case类上的字段以及我要忽略的所有其他字段(那些未映射的字段)到case类只需忽略),类似于Jackson通过@JsonIgn
1回复

Play:如何在反序列化JSON对象时处理可能的失败

下面是一个在Play控制器中对JSON进行序列化/反序列化的案例类: 上面的代码编译并正常工作......但我想知道如何在应用密码时处理可能的失败。 如果你看看Password.scala,你会看到我将构造函数设为私有,并在伴随对象中创建了一个返回Try ...的apply方法,但当然