【问题标题】:Parsing JSON in Play2 and Scala without Data Type在没有数据类型的 Play2 和 Scala 中解析 JSON
【发布时间】:2013-03-16 15:31:35
【问题描述】:
{
  "people": [
    {
      "name": "Jack",
      "age": 15
    },
    {
      "name": "Tony",
      "age": 23
    },
    {
      "name": "Mike",
      "age": 19
    }
  ]
}

这是我试图解析的 json 样本。我希望能够对每个人进行 foreach 操作并打印他们的姓名和年龄。

当它是单个项目或特定编号的项目时,我知道如何处理 json 数组。我不知道如何遍历所有项目。

谁能帮帮我?

【问题讨论】:

  • 注意:我也愿意为 JSON 使用完全不同的库,而不是与 Play 集成的库。但是,我不想这样做。

标签: arrays json scala playframework playframework-2.0


【解决方案1】:

使用 Play JSON 库有很多方法可以做到这一点。主要区别在于是否使用 Scala 案例类。

给定一个简单的json

val json = Json.parse("""{"people": [ {"name":"Jack", "age": 19}, {"name": "Tony", "age": 26} ] }""")

您可以使用案例类和Json宏来自动解析数据

import play.api.libs.json._

case class People(name: String, age: Int)

implicit val peopleReader = Json.reads[People]
val peoples = (json \ "people").as[List[People]]
peoples.foreach(println)

或者没有案例类,手动

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val personReader: Reads[(String, Int)] = (
  (__ \ "name").read[String] and 
  (__ \ "age").read[Int]
).tupled
val peoples = (json \ "people").as[List[(String, Int)]]
peoples.foreach(println)

换句话说,请查看有关此主题的非常完整的文档 :) http://www.playframework.com/documentation/2.1.0/ScalaJson

【讨论】:

  • 我的真实用例比我给出的 json 示例要复杂一些。是否可以只看名字而完全忽略年龄?还是必须始终将整个 json 转换为 scala 案例类?
  • (json \ "people" \\ "name") ?
  • 这对我不起作用。它一直说 List[People]] 没有反序列化器。 Json.reads 也对我不起作用。我在玩 2.0.4
  • 你检查过playframework.com/documentation/2.0.4/ScalaJsonGenerics 吗?有很多样本。而且我认为我上一条评论中的代码适用于 2.0.4。
  • .as[T] 不安全。使用.asOpt[T].validate[T]
【解决方案2】:

如果没有对象类型或者不想写Reads,可以使用.as[Array[JsValue]]

val jsValue = Json.parse(text)
val list = (jsValue \ "people").as[Array[JsValue]]

然后

list.foreach(a => println((a \ "name").as[String]))

在旧版本 (2.6.x) 中,可以使用 .as[List[JsValue]],但新版本仅支持 Array。

【讨论】:

  • 这个...如果你只想要一个庞大的工业 API 列表中的几个字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2016-08-11
  • 2016-10-06
  • 2017-07-23
  • 1970-01-01
相关资源
最近更新 更多