Foreach with JSON Arrays in Play2 and Scala

2019-03-11 04:06发布

问题:

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

Thats a sample of the json i'm trying to parse through. I want to be able to do a foreach operation on each person and println their name and age.

I know how to handle json arrays when it's a single item or a specific numbered item. I don't know how to iterate through all items.

Can anyone help me out?

回答1:

There are many ways to do this with the Play JSON Library. The main difference is the usage of Scala case class or not.

Given a simple json

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

You can use case class and Json Macro to automatically parse the data

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)

Or without case class, manually

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)

In other words, check the very complete documentation on this subject :) http://www.playframework.com/documentation/2.1.0/ScalaJson



回答2:

If you don't have the object type you can use .as[List[JsValue]]

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

Then access each element like usual

for (jsSubCategory <- jsSubCategories) {
  println((jsSubCategory \ "name").as[String])
}