7

这是我的搜索对象:

package models.helper
import play.api.libs.json.Format
import play.api.libs.json.JsValue
import play.api.libs.json.JsObject
import play.api.libs.json.JsString

case class Search (name: String, `type`:String){

  implicit object SearchFormat extends Format[Search] {
    def reads(json: JsValue): Search = Search(
      (json \ "name").as[String],
      (json \ "type").as[String]
    )

    def writes(s: Search): JsValue = JsObject(Seq(
        "name" -> JsString(s.name),
        "type" -> JsString(s.`type`)
    ))  
  }
}

我在使用 WS 调用 web 服务时尝试使用这个类:

val search = response.json.as[Search]

但是 scala 编译器一直抱怨这一行:

没有为 models.helper.Search 类型找到 Json 反序列化器。尝试为此类型实现隐式读取或格式。

谁能告诉我我做错了什么?

4

1 回答 1

21

确实,这个例子是错误的。您需要您的隐式Format[Search]值在隐式范围内可用。

在您的情况下,Format[Search]被定义为类的嵌套值Search,因此您只能从Search.

所以,你想要做的是在另一个地方定义它,在那里它可以被引用而不必创建一个实例Search,例如在一个Formats对象中:

object Formats {
  implicit SearchFormat extends Format[Search] {
    …
  }
}

然后你可以按如下方式使用它:

import Formats.SearchFormat
val search = response.json.as[Search]

您还可以通过在类的伴随对象中定义值来免除进口税。实际上,当需要给定类型的隐式值时,Scala 编译器会自动查找类型参数的伴随对象:Format[Search]Search

case class Search(name: String, `type`: String)

object Search {
  implicit object SearchFormat extends Format[Search] {
    …
  }
}

然后您可以使用它而无需导入它:

val search = response.json.as[Search]
于 2012-05-07T21:14:46.903 回答