如何在scala和play框架中从Format创建OFormat

时间:2016-05-20 09:05:22

标签: scala playframework

如何使用Json.Format[T]创建案例类的OFormat [T]?

1 个答案:

答案 0 :(得分:3)

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

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