将JSArray对象解析为Scala Play中的对象列表

jcm*_*jcm 3 json scala playframework playframework-json

我有以下JSON:

[{“ id_str”:“ 67979542”,“名称”:“帐户”},{“ id_str”:“ 12345678”,“名称”:“ account2”},{“ id_str”:“ 3423423423”,“名称”: “ account3”}]

已解析为包含3个元素的play.api.libs.json.JsArray对象。

我想Group使用以下代码将此JsArray解析为我的自定义对象:

 case class Group(id: String, name: String)

  implicit val twitterGroupReads: Reads[Group] = (
    (JsPath \\ "id_str").read[String] and
    (JsPath \\ "name").read[String]
    )(Group.apply _)
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何使用该库从数组中获取所有元素并将其解析为我的自定义对象。

acj*_*jay 7

Play JSON框架具有许多用于处理JSON 的内置对象,其中包括Reads.traversableReads,它们将隐式用于反序列化Reads可以隐式找到对象的其他类型的集合。您编写了一个适当的Reads对象。因此,除非我缺少任何东西,否则您最好走:

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

scala> import play.api.libs.functional.syntax._
import play.api.libs.functional.syntax._

scala> case class Group(id: String, name: String)
defined class Group

scala> implicit val twitterGroupReads: Reads[Group] = (
     |     (JsPath \\ "id_str").read[String] and
     |     (JsPath \\ "name").read[String]
     |     )(Group.apply _)
twitterGroupReads: play.api.libs.json.Reads[Group] = play.api.libs.json.Reads$$anon$8@f2fae02

scala> val json = Json.parse("""[{"id_str":"67979542","name":"account"}, {"id_str":"12345678","name":"account2"}, {"id_str":"3423423423","name":"account3"}]""")
json: play.api.libs.json.JsValue = [{"id_str":"67979542","name":"account"},{"id_str":"12345678","name":"account2"},{"id_str":"3423423423","name":"account3"}]

scala> json.as[Seq[Group]]
res0: Seq[Group] = List(Group(67979542,account), Group(12345678,account2), Group(3423423423,account3))
Run Code Online (Sandbox Code Playgroud)

  • 要添加的一件事:如果您可以在JSON和Scala类中使用完全相同的字段名称,则无需自定义`Reads`实现,并且JSON转换代码变得非常简单:`implicit val reads = Json。读取[Group]`。示例:http://stackoverflow.com/a/34618829/56285 (2认同)