2013-07-16 53 views
15

我想反序列化Play2中的JSON地圖的Scala對象列表 - 我用JSON描述一個相當平凡的用例。我的JSON輸出是沿着線的東西:序列化Play中的Scala列表到JSON

{ 
    "users": [ 
     { 
      "name": "Example 1", 
      "age": 20 
     }, 
     { 
      "name": "Example 2", 
      "age": 42 
     } 
    ] 
} 

要做到這一點,我在看Play2的題爲「全劇JSON庫」 JSON文件。對我來說,他們的例子很瑣碎,我已經證實他們爲我工作。因此,我能夠正確地反序列化一個單一的User對象。

但是,當我閱讀文檔時,製作一個包含JSON列表的地圖在Play2中看起來有點冗長。有沒有什麼我不在追求的?

這基本上是我簡單的Scala代碼:

case class User(name: String, age: Int) 

object UserList { 
    implicit val userFormat = Json.format[User] 

    val userList = List(User("Example 1", 20), User("Example 2", 42)) 
    val oneUser = Json.toJson(userList(0)) // Deserialize one Scala object properly to JSON. 
    // JSON: { "user" : [ <-- put content of userList here. How? 
    //     ] 
    //  } 
} 

所以我的問題是;我如何將上面的userList列表的內容轉換爲JSON中的散列,而不是像明確寫出每個散列元素那樣以更通用的方式進行轉換,如Play文檔所示?

+0

這不是序列化而是反序列化嗎?你不是想把你的對象轉換成JSON嗎? – Renan

+0

謝謝 - 修正:) –

回答

36
scala> import play.api.libs.json._ 
import play.api.libs.json._ 

scala> case class User(name: String, age: Int) 
defined class User 

scala> implicit val userFormat = Json.format[User] 
userFormat: play.api.libs.json.OFormat[User] = [email protected] 

scala> val userList = List(User("Example 1", 20), User("Example 2", 42)) 
userList: List[User] = List(User(Example 1,20), User(Example 2,42)) 

scala> val users = Json.obj("users" -> userList) 
users: play.api.libs.json.JsObject = {"users":[{"name":"Example 1","age":20},{"name":"Example 2","age":42}]} 
+0

哦哇 - 這很簡單!我必須再次閱讀文檔。不知道爲什麼沒有更清楚地告訴我 - 或者我錯過了它。謝謝!! –

+2

我必須說,通過閱讀www.playframework.com上有關Play的JSON支持的文檔,我從未想出如何實現我想要的內容以及粘貼的內容。文檔似乎相當垃圾。 –

+1

@JohanPaul是的,在某些時候,您必須查看方法簽名並閱讀源代碼(以查看在此特定情況下,「Writes」類型類型已由Play定義了哪些實例)。 –