2013-01-20 24 views
0

我一直在解析Play 2.0項目中的.json文件,有一件事我找不到。這裏是在線文檔的一個片段:如何在Play 2.0中獲取JSON樹中沒有明確名稱的元素?

{ 
    "users":[ 
    { 
     "name": "Bob", 
     "age": 31.0, 
     "email": "[email protected]" 
    }, 
    { 
     "name": "Kiki", 
     "age": 25.0, 
     "email": null 
    } 
    ] 
} 

我想知道的是,我如何獲取一個完整的用戶?問題是,我無法弄清楚如何引用代表單個用戶的參數分組。我試着像

(json \\ "users") 

這只是給所有的用戶在一個列表中的單個元素,我已經試過類似

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

但似乎我必須定義「用戶'我不知道什麼是適合的。

更好的是,有沒有辦法抓住列表中的所有客戶?甚至只是迭代樹並擊中每個用戶,以便我可以一次訪問特定用戶的所有信息?

+0

你用什麼玩版本?你打算去2.1嗎? –

+0

我使用的是2.0。這個問題與我正在開發的2.0項目有關,所以我不打算轉到2.1。 –

回答

1

如果你已經知道了JSON包含對象的列表,你可以要求該元素被提取爲一個,使用as[List[JsObject]]

例如:

val str = """{ 
    "users":[ 
    { 
     "name": "Bob", 
     "age": 31.0, 
     "email": "[email protected]" 
    }, 
    { 
     "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":"[email protected]"} 
user: {"name":"Kiki","age":25.0,"email":null} 

每個列表中的元素的支持相同的運營商爲原始JSON對象,這樣就可以使用(user \ "name").as[String]

提取單個值
+0

這樣做的伎倆,非常感謝你! –

0

Jerkson JSON(在遊戲中使用的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

+0

但是如果我不知道用戶數量呢?有沒有一種很好的方式來遍歷它們都不知道有多少? –

+0

@CharlesDaily好的,我已經更新了回覆。 – v6ak

相關問題