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

时间:2017-06-07 02:42:38

标签: json scala playframework-2.0

我只需要几个小时来探索Play Framework (2.5.1),但我很困惑为什么在您定义FormatReads时创建Writes。通过为您的类定义ReadsWrites,您还没有定义将类转换为JsValue和从{{1}}转换所需的所有功能吗?

1 个答案:

答案 0 :(得分:8)

如播放框架文档here

中所述
  

格式[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))

而不是这个。

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))