2013-03-26 23 views
13
"people": [ 
{ 
    "name": "Jack", 
    "age": 15 
}, 
{ 
    "name": "Tony", 
    "age": 23 
}, 
{ 
    "name": "Mike", 
    "age": 19 
} 
] 

Đó là mẫu của json tôi đang cố phân tích. Tôi muốn có thể làm một hoạt động foreach trên mỗi người và in tên và tuổi của họ.Foreach with JSON Arrays in Play2 and Scala

Tôi biết cách xử lý các mảng json khi đó là một mục duy nhất hoặc một mục được đánh số cụ thể. Tôi không biết cách lặp qua tất cả các mục.

Có ai có thể giúp tôi không?

+0

Lưu ý: Tôi cũng mở để sử dụng thư viện hoàn toàn khác với JSON so với những gì được tích hợp với Play. Nhưng, tôi không thích. – Commander

Trả lời

23

Có nhiều cách để thực hiện việc này với Thư viện JSON Play. Sự khác biệt chính là việc sử dụng lớp vỏ Scala hay không.

Cho một json đơn giản

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

Bạn có thể sử dụng lớp trường hợp và Json Macro để tự động phân tích các dữ liệu

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) 

Hoặc mà không trường hợp lớp, tay

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) 

Trong khác các từ, kiểm tra tài liệu đầy đủ về chủ đề này :) http://www.playframework.com/documentation/2.1.0/ScalaJson

+0

Usecase thực sự của tôi phức tạp hơn một chút so với mẫu json tôi đã đưa ra. Có thể chỉ đọc tên và hoàn toàn bỏ qua tuổi tác không? Hoặc bạn phải luôn luôn chuyển đổi toàn bộ json thành một lớp scala trường hợp? – Commander

+1

'(json \" người "\\" tên ")'? –

+0

Điều này không hiệu quả đối với tôi. Nó cứ nói rằng không có deserializer cho List [People]]. Json.reads cũng không hoạt động đối với tôi. Tôi đang chơi trên Play 2.0.4 – Commander