2013-06-25 20 views
3

我想寫一個通用的方式來處理在Play 2.1中寫入到JSON的Pk類,因爲我覺得爲每個Pk類型編寫一個單獨的類是浪費的您正在使用。這是我到目前爲止有:通用的方式來實現一個Pk寫在Play Scala

implicit def pkWrites[E] = new Writes[Pk[E]] { 
    def writes(pk: Pk[E]): JsValue = Json.toJson(pk.get) 
} 

...我使用它的代碼是這樣的:現在

Json.toJson(Id(42L)) 

,這類作品(斯卡拉發現它),但這裏的是我得到的錯誤:

No Json deserializer found for type E. 
Try to implement an implicit Writes or Format for this type. 

其中type ELong(因此,具有解串器)。無論如何,我可以告訴Json.toJsonE是什麼類型?

回答

2

您需要做的唯一事情就是確保在範圍內有E類型的反序列化器,因爲現在您不能確定您使用的每種類型都是可寫的。你可以嘗試一下:

class Value[A](value: A){ 
    def get[A] = value 
} 

implicit def valueWrites[E](implicit longWrites: Writes[E]) = new Writes[Value[E]]{ 
    def writes(value: Value[E]): JsValue = Json.toJson(value.get) 
} 

Json.toJson(new Value(5L)) 

可以縮短隱含的方法:

implicit def valueToJson[E: Writes] = new Writes[Value[E]]{ 
    def writes(value: Value[E]): JsValue = Json.toJson(value.get) 
} 

編輯:

上述這兩種方法是完全一樣的,這意味着該方法需要隱含價值,你的情況Pk[Long],所以這個方法知道如何反序列化數字。換句話說,E: Writes告訴方法:搜索類型Writes[E]的隱式值。

編輯2:

Json.toJson(1)作品,因爲在範圍Writes[Int]。以相同的方式工作valueWrites[Int],範圍內有Writes[Int],所以方法可以使用Writes[Int]來反序列化字段value,並因此反序列化整個類。

+0

好吧,我所做的只是將'E:Writes'添加到'pkWrites'類型參數中,它可以工作......':'是什麼意思?我對Scala很陌生。 – cdmckay

+0

看到我的編輯,是否清楚? – Infinity

+0

那麼'E:Writes'就是說確保'E'可以隱式轉換爲'Writes'嗎? – cdmckay

相關問題