【发布时间】:2017-08-22 18:06:33
【问题描述】:
如何以与Json.Format[T] 创建案例类相同的简单方式为案例类创建 OFormat[T]?
【问题讨论】:
-
在 Play 2.5.x 中,
Json.format[A]确实返回OFormat[A]。为什么需要这么多版本才能做到这一点,我不知道,因为宏只适用于对象。
标签: scala playframework
如何以与Json.Format[T] 创建案例类相同的简单方式为案例类创建 OFormat[T]?
【问题讨论】:
Json.format[A] 确实返回 OFormat[A]。为什么需要这么多版本才能做到这一点,我不知道,因为宏只适用于对象。
标签: scala playframework
这是我发现的(非常)简单的解决方案: 创建一个辅助对象:
import play.api.libs.json.{Format, OFormat, JsObject, JsValue, JsResult}
object JsonUtil {
def oFormat[T](format:Format[T]) : OFormat[T] = {
val oFormat: OFormat[T] = new OFormat[T](){
override def writes(o: T): JsObject = format.writes(o).as[JsObject]
override def reads(json: JsValue): JsResult[T] = format.reads(json)
}
oFormat
}
}
并像这样使用它:
import play.modules.reactivemongo.json._
implicit val formatFileToSave : Format[FileToSaveData] = Json.format[FileToSaveData]
implicit val oFormatFileToSave: OFormat[FileToSaveData] = JsonUtil.oFormat(formatFileToSave)
我希望明确传递“格式”,但是当我尝试使用以下内容运行时
def oFormat[T]()(implicit format:Format[T])我有java.lang.RuntimeException
如果有人能解释为什么或如何在没有 RuntimeException 的情况下使用“隐式”,我会很高兴听到。
我正在运行 Java 8,玩 2.4.0 和 scala 2.11.7(显然 FileToSaveData 是我想要序列化的案例类)
【讨论】: