【问题标题】:Play2 does not find my implicit Reads or Format for JSONPlay2 找不到我的 JSON 隐式读取或格式
【发布时间】:2012-05-07 20:51:27
【问题描述】:

这是我的搜索对象:

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 反序列化器。尝试 为此类型实现隐式读取或格式化。

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

【问题讨论】:

    标签: json scala playframework-2.0 playframework-json


    【解决方案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]
    

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

    case class Search(name: String, `type`: String)
    
    object Search {
      implicit object SearchFormat extends Format[Search] {
        …
      }
    }
    

    那你不用导入就可以使用了:

    val search = response.json.as[Search]
    

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 1970-01-01
      • 2019-07-21
      • 2014-10-31
      • 2023-03-16
      • 2016-05-03
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多