gpt4 book ai didi

scala - 为什么 Json.writes[T] 需要一个 `apply` 方法?

转载 作者:行者123 更新时间:2023-12-03 19:56:22 24 4
gpt4 key购买 nike

我有一些扩展这个类的案例类:

class CitySuggestion(val name: String, val locationId: String, val locationKind: String)

我想用 Json.writes[CitySuggestion]作为这个类的 JSON 编写器,所以我定义了一个 unapply其伴生对象中的方法:
object CitySuggestion {
def unapply(cs: CitySuggestion): Option[(String, String, String)] =
Some((cs.name, cs.locationId, cs.locationKind))
}

我认为这就足够了,但是编译器现在要求提供 apply方法也是:

No apply function found
[error] implicit lazy val citySuggestionWrites = Json.writes[CitySuggestion]



为什么需要一个apply方法?我不想反序列化 JSON,我必须添加逻辑来确定它应该反序列化到哪个子类的实例。

最佳答案

这是因为 Play Json 的 writes & reads宏共享一个 common implementation.在这个实现中,类型 A提供给 Json.writes[A]检查它的 apply 方法,该方法又用于生成 Writes 的申请。实例。

作为使用“写入”宏的替代方法,您可以创建自己的 Write[CitySuggestion]像这样:

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val citySuggestionWrites: Writes[CitySuggestion] = (
(JsPath \ "name").write[String] and
(JsPath \ "locationId").write[String] and
(JsPath \ "locationKind").write[String]
)(unlift(CitySuggestion.unapply))

关于scala - 为什么 Json.writes[T] 需要一个 `apply` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052664/

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