Подтвердить что ты не робот

Разбор JSON в Play2 и Scala без типа данных

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

Вот образец JSON, который я пытаюсь разобрать. Я хочу иметь возможность выполнять операцию foreach для каждого человека и печатать его имя и возраст.

Я знаю, как обращаться с массивами json, когда это отдельный элемент или конкретный пронумерованный элемент. Я не знаю, как перебирать все элементы.

Может кто-нибудь мне помочь?

4b9b3361

Ответ 1

В Play JSON Library есть много способов сделать это. Основное различие заключается в использовании класса класса Scala или нет.

Учитывая простой json

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

Вы можете использовать класс case и Json Macro для автоматического анализа данных

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)

Или без класса case, вручную

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

Ответ 2

Если у вас нет типа объекта или вы не хотите писать .as[List[JsValue]] чтения, вы можете использовать .as[List[JsValue]]

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

затем

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