繁体   English   中英

Play2找不到我对JSON的隐式读取或格式

[英]Play2 does not find my implicit Reads or Format for JSON

这是我的搜索对象:

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

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

确实这个例子是错的。 您需要在隐式作用域中使用隐式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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM