2014-09-24 3 views
0

Я хочу сделать универсальный JSON-сериализатор различных типов моего собственного списка (например, Group, GroupView, GroupItemsView). Итак, я определяю все три 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 Scala JSON Serializer работать с моим типом универсально?

ответ

1

implicits необходимо решить во время компиляции. Таким образом, ваша функция должна обеспечивать правильное использование Writes для функции во время компиляции. Вы можете сделать это, используя параметр типа и принимает неявный:

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

Спасибо, что решает мою проблему! Я полностью забыл о параметризации типа. –

+1

Также обратите внимание, что Json уже предоставляет запись для списков, учитывая, что у вас есть сценарист для класса case, поэтому, если вы не планируете добавлять дополнительные функции к своей функции groupViewToJson, вы можете использовать его вместо этого. –

Смежные вопросы