【问题标题】:How to create OFormat from Format in scala and play framework如何在scala和play框架中从Format创建OFormat
【发布时间】:2017-08-22 18:06:33
【问题描述】:

如何以与Json.Format[T] 创建案例类相同的简单方式为案例类创建 OFormat[T]?

【问题讨论】:

  • 在 Play 2.5.x 中,Json.format[A] 确实返回 OFormat[A]。为什么需要这么多版本才能做到这一点,我不知道,因为宏只适用于对象。

标签: scala playframework


【解决方案1】:

这是我发现的(非常)简单的解决方案: 创建一个辅助对象:

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 是我想要序列化的案例类)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2013-11-05
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    相关资源
    最近更新 更多