如果你有Reads [T]和Writes [T],那么Format [T]的目的是什么?

Tyl*_*ler 3 json scala playframework-2.0

我只是花了几个小时来探索它Play Framework (2.5.1),我很困惑,为什么你会创建一个Format你已经定义ReadsWrites.通过为您的类定义ReadsWrites,您没有定义将类转换为和从中转换所需的所有功能JsValue吗?

rog*_*one 9

正如这里的play-framework文档中所提到的

Format [T]只是Reads和Writes特征的混合,可以用于隐式转换来代替其组件.

格式是Reads [T]和Writes [T]的组合.因此,您可以为类型T定义单个隐式Format [T],并使用它来读取和写入Json,而不是为类型T定义单独的隐式Reads [T]和Writes [T].因此,如果您已经有了Reads [T]并且为您的类型T定义了Write [T],然后不需要Format [T],反之亦然.

Format的一个优点是,您可以为类型T定义单个隐式格式[T],而不是定义两个单独的Read [T]和Writes [T],如果它们都是对称的(即读取和写入).因此Format使您的JSON结构定义更少重复.例如,你可以做这样的事情

implicit val formater: Format[Data] = (
    (__ \ "id").format[Int] and
    (__ \ "name").format[String] and
    (__ \ "value").format[String]
  ) (Data.apply, unlift(Data.unapply))
Run Code Online (Sandbox Code Playgroud)

而不是这个.

implicit val dataWriter: Writes[Data] = (
    (__ \ "id").write[Int] and
    (__ \ "name").write[String] and
    (__ \ "file_type").write[String]
  ) (Data.apply)

implicit val dataWriter: Reads[Data] = (
    (__ \ "id").read[Int] and
    (__ \ "name").read[String] and
    (__ \ "file_type").read[String]
  ) (unlift(Data.unapply))
Run Code Online (Sandbox Code Playgroud)