2013-07-16 36 views
15

Tôi đang cố gắng deserialize một danh sách các đối tượng Scala thành một bản đồ JSON trong Play2 - một trường hợp sử dụng khá nhỏ với JSON, tôi muốn nói. đầu ra JSON của tôi sẽ là một cái gì đó dọc theo dòng:Nối tiếp một danh sách Scala thành JSON trong Play2

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

Để đạt được điều này tôi nhìn vào tài liệu JSON của Play2 tựa đề "Play JSON thư viện". Đối với tôi, các ví dụ của họ khá tầm thường, và tôi đã xác nhận rằng họ làm việc cho tôi. Do đó, tôi có thể deserialize một đối tượng User duy nhất đúng cách.

Nhưng việc tạo bản đồ chứa danh sách bằng JSON có vẻ hơi tiết trong Play2, khi tôi đọc tài liệu. Có cái gì tôi không grokking?

này về cơ bản là đang Scala đơn giản của tôi:

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? 
    //     ] 
    //  } 
} 

Vì vậy, câu hỏi của tôi sẽ là; làm thế nào tôi có thể chuyển đổi nội dung của Danh sách userList ở trên thành một hàm băm trong JSON theo cách tổng quát hơn viết một cách rõ ràng từng phần tử băm, như tài liệu Play gợi ý?

+0

Sẽ không được tuần tự hóa thay vì deserializing? Không phải bạn đang cố chuyển đổi đối tượng của mình thành JSON? – Renan

+0

Cảm ơn - đã sửa lỗi :) –

Trả lời

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

Ồ wow - thật đơn giản! Tôi phải đọc lại tài liệu. Tự hỏi tại sao điều này chưa được nói rõ ràng hơn - hoặc tôi đã bỏ lỡ nó. Cảm ơn!! –

+2

Tôi phải nói rằng chỉ bằng cách đọc các tài liệu tại www.playframework.com về hỗ trợ JSON của Play, tôi sẽ không bao giờ nghĩ ra cách đạt được những gì tôi muốn - và những gì bạn dán. Các tài liệu có vẻ khá là rác rưởi. –

+1

@JohanPaul vâng, tại một thời điểm nào đó bạn phải xem xét các chữ ký của phương thức và đọc mã nguồn (để xem trường hợp của typeclass 'Writes' đã được định nghĩa bởi Play, trong trường hợp cụ thể này). –

Các vấn đề liên quan