Play2没有找到我的暗示读取或格式JSON(Play2 does not find my impl

2019-07-29 07:09发布

这是我的搜索对象:

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 WebService时,催产素使用这个类:

val search = response.json.as[Search]

但Scala编译器不断抱怨在这条线:

无解串器的Json发现型models.helper.Search。 试图实现一个隐含的读取或格式为这种类型。

任何人可以告诉我,我做错了什么?

  • 得到了来自例如https://sites.google.com/site/play20zh/scala-developers/working-with-json
  • 此线程讨论了同样的问题,但没有给出解决方案,在什么网站有什么例子? https://groups.google.com/forum/?fromgroups#!topic/play-framework/WTZrmQi5XxY

Answer 1:

事实上,例子是错误的。 你需要你的隐Format[Search]值在隐式作用域是可用的。

你的情况的Format[Search]被定义为类的嵌套值Search ,所以你只能从一个实例达到它Search

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

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

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

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

您也可以通过定义摆脱进口税Format[Search]在的同伴对象值Search类。 事实上,当它需要一个给定类型的隐含价值,Scala编译器会自动查找的类型参数的同伴对象:

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

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

然后你可以使用它,而无需将其导入:

val search = response.json.as[Search]


文章来源: Play2 does not find my implicit Reads or Format for JSON