15
{
  "people": [
    {
      "name": "Jack",
      "age": 15
    },
    {
      "name": "Tony",
      "age": 23
    },
    {
      "name": "Mike",
      "age": 19
    }
  ]
}

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

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

谁能帮我吗?

4

2 回答 2

25

使用 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

于 2013-03-26T18:46:18.373 回答
4

如果您没有对象类型或不想写读取,您可以使用.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。

于 2018-03-18T10:15:16.397 回答