2016-09-30 61 views
0

我是Scala和Play的新手,我要求這個簡單示例的幫助。我試圖自己尋找解決方案,但我沒有成功。 我正在嘗試從掌握Scala書籍的播放框架,關於擴展Json解析器(第29-30頁)的例子。Scala玩Json隱式寫入類型不匹配

我使用的環境是:

斯卡拉:2.11.7 播放:2.5.8 激活:1.3.10

的代碼是:

case class Subscription(emailId: String, interval: Long) 

在控制器:

import play.api.libs.json.Json 
import play.api.libs.json.JsValue 
import play.api.libs.json.Writes 

..... 
val parseAsSubscription = parse.using { 
    request => 
     parse.json.map { 
     body => 
      val emailId:String = (body \ "emailId").as[String] 
      val fromDate:Long = (body \ "fromDate").as[Long] 
      Subscription(emailId, fromDate) 
     } 
    } 

implicit val subWrites:Writes[Subscription] = Json.writes[Subscription] 

def getSub = Action(parseAsSubscription) { 
    request => 
     val subscription: Subscription = request.body 
     Ok(Json.toJson(Subscription)) 
} 

該行:Ok(Json.toJson(Subscription)) giv es an error

找不到類型爲models.ubscription.type的Json序列化程序。嘗試 實現此類型的隱式Writes或Format。

這很奇怪,因爲Writes對象定義在上面的一行。因此,我試圖將它傳遞給方法的toJSON明確:

Ok(Json.toJson(Subscription)(subWrites))

它給了我一個不同的錯誤,這部分解釋了爲什麼現有的寫入對象不適合:

類型不匹配;
實測值: play.api.libs.json.Writes [models.Subscription]
需要: play.api.libs.json.Writes [models.Subscription.type]

然而,我不不明白這個錯誤的性質以及什麼是models.Subscription.type。 我曾經在另一個例子中做過類似的事情,它工作得很好。 任何幫助將不勝感激。

回答

2

您試圖序列化類型Subscription,而不是請求正文,您將其存儲爲值subscription。嘗試用Ok(Json.toJson(subscription))替換最後一行。

+1

非常感謝,@Eric。這真是我身邊的一個愚蠢的錯誤 –

+0

不客氣!愚蠢的錯誤是難以捉摸的:) – Eric