2014-09-24 115 views
0

我想製作不同我自己的列表類型(即Group,GroupView,GroupItemsView)的通用JSON序列化程序。所以,我定義這三個Json.FormatScala Universal Serializer PlayFramework

implicit val groupsFormat = Json.format[Group] 
    implicit val groupsViewFormat = Json.format[GroupView] 
    implicit val groupsItemsViewFormat = Json.format[GroupItemsView] 

我的功能應序列不同的列表項:

def groupViewToJson(entityList: List[Any]): JsValue = { 
    val jsonList = Json.toJson(
     entityList.map(m => Json.toJson(m)) 
    ) 
    jsonList 
    } 

它僅當對entityList我定義特定的列表類型的作品。它不想使用任何類型。錯誤如下:

No Json serializer found for type Any. Try to implement an implicit Writes or Format for this type. 

如何使PlayFramework斯卡拉JSON序列與我喜歡的類型普遍工作?

回答

1

implicits需要在編譯時解決。因此,你的函數需要在編譯過程中爲函數提供正確的寫入。你可以通過使用類型參數並接受隱式:

def groupViewToJson[T](entityList: List[T])(implicit writer:Writes[T]): JsValue = { 
    val jsonList = Json.toJson(
     entityList.map(m => Json.toJson(m)) 
    ) 
    jsonList 
    } 

,並呼籲groupViewToJson時,隱含的需求是在範圍之內。一個完整的例子是:

import play.api.libs.json._ 
case class Group(name:String) 
case class GroupView(name:String, group: Group) 

implicit val groupsFormat = Json.format[Group] 
implicit val groupsViewFormat = Json.format[GroupView] 
//implicit val groupsItemsViewFormat = Json.format[GroupItemsView] 


def groupViewToJson[T](entityList: List[T])(implicit writer:Writes[T]): JsValue = { 
    val jsonList = Json.toJson(
     entityList.map(m => Json.toJson(m)) 
    ) 
    jsonList 
    } 

scala> val group = Group("MyGroup") 
group: Group = Group(MyGroup) 

scala> val groupView = GroupView("MyGroupView", group) 
groupView: GroupView = GroupView(MyGroupView,Group(MyGroup)) 

scala> groupViewToJson(groupView :: Nil) 
res4: play.api.libs.json.JsValue = [{"name":"MyGroupView","group":{"name":"MyGroup"}}] 
+0

謝謝它解決了我的問題!我完全忘記了類型參數化。 – 2014-09-24 11:24:53

+1

另外,請注意Json已經爲Lists提供了一個編寫器,因爲您擁有case類的編寫器,所以除非您打算爲groupViewToJson函數添加更多功能,否則可以使用它。 – 2014-09-24 11:27:27

相關問題