Scala Play Json隐式写入类型不匹配

时间:2016-09-30 19:50:29

标签: json scala playframework-2.0

我是Scala和Play的新手,我在这个简单的例子中寻求帮助。我试图自己寻找解决方案,但我没有成功。 我正在尝试从Mastering Play Framework for Scala本书中获取示例,该示例关于扩展Json解析器(第29-30页)。

我使用的环境是:

斯卡拉: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))给出错误

  

找不到类型models.Subscription.type的Json序列化程序。尝试   为此类型实现隐式Writes或Format。

这很奇怪,因为Writes对象定义在上面一行。因此,我试图明确地将它传递给toJson方法:

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

它给了我一个不同的错误,这部分解释了为什么现有的Writes对象不适合:

  

类型不匹配;
  发现:   play.api.libs.json.Writes [models.Subscription]
  需要:   play.api.libs.json.Writes [models.Subscription.type]

但是,我不了解此错误的性质以及models.Subscription.type的含义。  我曾经在一个不同的例子中做了类似的事情,它运作得很好。  任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您正在尝试序列化Subscription类型,而不是您存储为值subscription的请求正文。尝试使用Ok(Json.toJson(subscription))替换最后一行。