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

這就是我試圖解析的json的樣本。我希望能夠對每個人進行一次foreach操作並打印出他們的姓名和年齡。在Play2和Scala中使用JSON數組的Foreach

我知道如何處理json數組,當它是單個項目或特定編號的項目時。我不知道如何迭代所有項目。

任何人都可以幫我嗎?

+0

注意:我也願意爲JSON使用完全不同的庫,而不是與Play集成的庫。但是,我不想。 – Commander 2013-03-26 18:15:37

回答

23

有許多方法可以通過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

+0

我的真實用例比我給出的json樣本複雜一點。是否有可能只讀名字並完全忽略年齡?或者你必須總是將整個JSON轉換爲一個Scala案例類? – Commander 2013-03-26 19:10:07

+1

'(json \「people」\\「name」)'? – 2013-03-26 19:14:05

+0

這不適合我。它一直說沒有List [People]的反序列化器]。 Json.reads也沒有爲我工作。我在Play 2.0.4 – Commander 2013-03-27 15:59:12