2014-12-04 36 views
0

我正在寫一個Play 2.3應用程序,由支持json的客戶端的mongodb支持。該應用程序正在從Rails移植,並且我的許多現有mongo文檔都有超過22個字段,這些字段阻止了使用Json.format宏將它們序列化到案例類。我使用shapeless from this gist(我還沒完全理解)解決這個問題。在Play 2.3中寫入超過21個字段的JSON視圖

現在我面臨爲客戶端編寫JSON「視圖」的問題。並非我的文檔中的所有數據都應發送給客戶端 - 散列密碼等。要發送正確的數據,我正嘗試使用自定義Writes,但是又一次遇到了21字段限制問題。例如,下面的編譯失敗:

val viewWrites: Writes[User] = (
(__ \ "id").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] and 
(__ \ "u").write[String] 
) { user: User => 
    (user._id.toString(), 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username, 
    user.username) 
} 

與錯誤

play.api.libs.functional.FunctionalBuilder[play.api.libs.json.OWrites]#CanBuild22[String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String] does not take parameters 

如果我刪除它會被正確編譯這些領域之一。我意識到,我就能把模型分解成幾個部分,但我不想這樣做,因爲:

  1. 我移植on Rails的Ruby中這個應用程序和客戶端已經預期特定格式的數據。我在rails上使用JBuilder來創建JSON視圖。我寧願不必修改客戶端。
  2. 有很多情況下需要寫入超過21個字段的JSON。我沒有任何意義,玩法框架會忽略這些用例。我覺得我必須錯過一個共同的解決方案。

我該如何編寫任意大小的JSON「視圖」,以期望的格式爲我的現有客戶端提供服務?

回答

1

聲明您寫如下:

implicit val viewWrites = new Writes[User] { 
    def writes(user: User) = Json.obj(
    "id" -> user._id.toString(), 
    "u" -> user.username, 
    //repeat 20 times 
    "u" -> user.username) 
} 

基本上,要手動創建的寫操作[用戶]對象,並明確地定義一個寫操作方法,該方法採用類型用戶的單個參數,並且返回一個JsObject 。您可以根據需要包含/排除字段。

+0

你知道在將來的Play版本中是否將更新讀/寫組合器格式來處理超過21個字段?這似乎是當前版本的一個相當大的省略。 – imagio 2014-12-04 19:15:21