我只需要几个小时来探索Play Framework (2.5.1)
,但我很困惑为什么在您定义Format
和Reads
时创建Writes
。通过为您的类定义Reads
和Writes
,您还没有定义将类转换为JsValue
和从{{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))