如何为 Java 库中没有 apply 方法的对象编写 JSON 格式?
我已经在这个特定的问题上呆了大约一个星期了,我想我要把它写成一个问题,以清除我的想法并获得一些指导。
所以我有一个案例类,它有一个java.sql.Timestamp字段:
case class Request(id: Option[Int], requestDate: Timestamp)
我想把它转换为JsObject
val q = Query(Requests).list // This is Slick, a database access lib for Scala
printList(q)
Ok(Json.toJson(q)) // and this is where I run into trouble
“没有为类型 List[models 找到 Json 反序列化程序。请求]。尝试为此类型实现隐式写入或格式。好吧,这是有道理的。
因此,按照此处的Play文档,我尝试编写一个格式...
implicit val requestFormat = Json.format[Request] // need Timestamp deserializer
implicit val timestampFormat = (
(__ \ "time").format[Long] // error 1
)(Timestamp.apply, unlift(Timestamp.unapply)) // error 2
错误 1
Description Resource Path Location Type overloaded method value format with alternatives:
(w: play.api.libs.json.Writes[Long])(implicit r: play.api.libs.json.Reads[Long])play.api.libs.json.OFormat[Long]
<and>
(r: play.api.libs.json.Reads[Long])(implicit w: play.api.libs.json.Writes[Long])play.api.libs.json.OFormat[Long]
<and>
(implicit f: play.api.libs.json.Format[Long])play.api.libs.json.OFormat[Long]
cannot be applied to (<error>, <error>)
显然,像这样导入(请参阅文档“ctrl + F导入”)给我带来了麻烦:
import play.api.libs.json._ // so I change this to import only Format and fine
import play.api.libs.functional.syntax._
import play.api.libs.json.Json
import play.api.libs.json.Json._
现在重载错误消失了,我到达了更多的废话:我已经导入了,就像文档中所说的那样!这家伙遇到了同样的问题,但进口为他修复了它!为什么呢?!我认为这可能只是Eclipse的问题,并试图无论如何......没有任何变化。好。编译器始终是正确的。not found: value __
.../functional.syntax._
play run
Imported play.api.lib.json.JsPath,更改为 和 wallah:__
JsPath
错误 2
value apply is not a member of object java.sql.Timestamp
value unapply is not a member of object java.sql.Timestamp
我还尝试更改钉子并为此编写一个写而不是格式,没有花哨的新组合器()功能,方法是遵循官方文档基于/复制粘贴的原始博客文章:__
// I change the imports above to use Writes instead of Format
implicit val timestampFormat = new Writes1661194656( // ERROR 3
def writes(t: Timestamp): JsValue = { // ERROR 4 def is underlined
Json.obj(
/* Returns the number of milliseconds since
January 1, 1970, 00:00:00 GMT represented by this Timestamp object. */
"time" -> t.getTime()
)
}
)
错误 3:trait Writes is abstract, cannot be instantiated
错误 4:illegal start of simple expression
在这一点上,我即将在这里结束我的智慧,所以我只是回到我的心理堆栈的其余部分,并从我的第一段代码中报告。
我非常感谢任何能让我摆脱编码痛苦的人