2017-06-07 33 views
2

我只有幾小時的時間去探索Play Framework (2.5.1),我很困惑,爲什麼當你已經定義ReadsWrites時,你會創建一個Format。通過爲你的類定義ReadsWrites,你還沒有定義將類與JsValue進行轉換所需的所有功能嗎?如果您有讀取[T]和寫入[T],Format [T]的目的是什麼?

+0

如果你回答你的問題可以接受答案嗎? –

回答

8

作爲播放框架文檔here

格式[T]中提到的僅僅是一個混合的讀取和寫入的特性和可以代替其部件一起使用 爲隱式轉換。

格式是Reads [T]和Writes [T]的組合。因此,您可以爲T類型定義單個隱式Format [T],並使用它來讀取和寫入Json,而不是爲T類型定義單獨的隱式Reads [T]和Writes [T]。因此,如果您已經具有Reads [T]併爲您的類型T寫入[T],然後格式[T]不是必需的,反之亦然。

Format的一個優點是你可以爲你的類型T定義一個單獨的Implicit Format [T],而不是定義兩個獨立的Reads [T]和Writes [T],如果它們都是對稱的(即讀和寫) 。因此,格式使您的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)) 
相關問題