0

我一直在解析 Play 2.0 项目中的 .json 文件,但有一件事我无法弄清楚。这是来自在线文档的片段:

{
  "users":[
    {
      "name": "Bob",
      "age": 31.0,
      "email": "bob@gmail.com"
    },
    {
      "name": "Kiki",
      "age":  25.0,
      "email": null
    }
  ]
}

我想知道的是,我如何抓住一个完整的用户?问题是我不知道如何引用代表单个用户的参数分组。我试过类似的东西

( json \\ "users" ) 

它只是将所有用户作为列表中的一个元素提供,我尝试过类似的东西

( json \ "users" \ (user)(0)) 

但似乎我必须定义“用户”,我不知道什么是合适的。

更好的是,有没有办法获取列表中的所有客户?或者甚至只是遍历树并点击每个用户,以便我可以一次访问特定用户的所有信息?

4

2 回答 2

1

如果您已经知道 JSON 包含对象列表,则可以使用as[List[JsObject]].

例如:

val str = """{
  "users":[
    {
      "name": "Bob",
      "age": 31.0,
      "email": "bob@gmail.com"
    },
    {
      "name": "Kiki",
      "age":  25.0,
      "email": null
    }
  ]
}"""

val json = Json.parse(str)
val users = (json \ "users").as[List[JsObject]]
users.foreach { user =>
  println("user: " + user)
}

生成:

user: {"name":"Bob","age":31.0,"email":"bob@gmail.com"}
user: {"name":"Kiki","age":25.0,"email":null}

这些列表元素中的每一个都支持与原始 JSON 对象相同的运算符,因此您可以使用(user \ "name").as[String]等提取单个值。

于 2013-01-24T05:48:29.003 回答
0

Jerkson JSON(Play 中使用的 JSON 库!)支持这种方式:

(json \ "users")(0)

如果要迭代,可以将其转换为 JArray (并可能检查类型)并调用该elements方法:

(json \ "users").asInstanceOf[JArray].elements foreach {
    ...
}

可能没有更好的方法:https ://github.com/codahale/jerkson/blob/master/src/main/scala/com/codahale/jerkson/AST.scala

于 2013-01-20T06:53:59.060 回答