2013-03-26 66 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