Som*_*tik 7 json scala playframework-2.0 playframework-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`)
))
}
}
Run Code Online (Sandbox Code Playgroud)
我在尝试使用WS调用web服务时尝试使用此类:
val search = response.json.as[Search]
Run Code Online (Sandbox Code Playgroud)
但scala编译器一直在抱怨这条线:
找不到类型models.helper.Search的Json反序列化器.尝试为此类型实现隐式读取或格式.
谁能告诉我我做错了什么?
Jul*_*Foy 21
确实这个例子是错的.您需要隐式Format[Search]值在隐式范围内可用.
在您的情况下,它Format[Search]被定义为类的嵌套值Search,因此您只能从一个实例中获取它Search.
所以,你想要做的是在另一个地方定义它,在那里它可以被引用,而不必创建一个实例Search,例如在一个Formats对象中:
object Formats {
implicit SearchFormat extends Format[Search] {
…
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用它如下:
import Formats.SearchFormat
val search = response.json.as[Search]
Run Code Online (Sandbox Code Playgroud)
您还可以通过定义类的伴随对象中的值来消除进口税.实际上,当Scala编译器需要给定类型的隐式值时,它会自动查找类型参数的伴随对象:Format[Search]Search
case class Search(name: String, `type`: String)
object Search {
implicit object SearchFormat extends Format[Search] {
…
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用它而无需导入它:
val search = response.json.as[Search]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9924 次 |
| 最近记录: |