gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:42:46 24 4
gpt4 key购买 nike

这是我的搜索对象:

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 编译器一直在这一行提示:

No Json deserializer found for type models.helper.Search. Try to implement an implicit Reads or Format for this type.

有人可以告诉我我做错了什么吗?

最佳答案

这个例子确实是错误的。您需要隐式 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]

关于json - Play2 找不到我的 JSON 隐式读取或格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10488950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com