2013-11-11 3 views
3

У меня есть простой структуры данных пользовательских которые я использую для отображения результатов из базы данных:Scala/Play: JSON сериализации вопрос

case class Filter(id: Int, table: String, name: String, Type: String, structure: String) 

Результирующий тип объекта List[Filter] и если преобразуется в формат JSON, он должен выглядеть что-то вроде этого:

[ 
    { 
     "id":   1, 
     "table":  "table1", 
     "name":   "name1", 
     "Type":   "type1", 
     "structure": "structure1" 
    }, 
    { 
     "id":   2, 
     "table":  "table2", 
     "name":   "name2", 
     "Type":   "type2", 
     "structure": "structure2" 
    } 
] 

Теперь, когда я пытаюсь сериализации моего объекта в JSON

val result: String = Json.toJson(filters) 

Я получаю что-то вроде

No Json deserializer found for type List[Filter]. Try to implement an implicit Writes or Format for this type. 

Как решить эту, казалось бы, простая задача без написания какого-то смешное количества шаблонного?

Мой стек Play 2.2.1, 2.10.3 Scala, Java 8 64bit

+0

Вы проверили, есть ли у вас проблемы с «Тип», как имя поля? –

ответ

2

Короткий ответ:

Просто добавьте:

implicit val filterWrites = Json.writes[Filter] 

Longer ответить:

Если вы посмотрите на определение Json.toJson, вы увидите, что его полная подпись i s:

def toJson[T](o: T)(implicit tjs: Writes[T]): JsValue = tjs.writes(o) 

Writes[T] знает, как взять T и превратить его в JsValue. Вам нужно будет иметь неявный Writes[Filter], который знает, как сериализовать ваш экземпляр Filter. Хорошей новостью является то, что библиотека JSON от Play имеет макрос, который может создать для вас эти Writes[_], поэтому вам не нужно писать скучный код, который преобразует поля вашего класса case в значения JSON. Чтобы вызвать этот макрос и получить его значение под неявным поиском, добавьте строку выше в вашу область.

+0

Кажется, что это не нравится - ошибка говорит «Функция unapply не найдена». Любая идея, что это такое? – Caballero

+0

Следующий код компилируется и работает для меня: https://gist.github.com/thesamet/7419702 – thesamet

+0

FWIW, макрос пытается искать 'unapply' в * companion object * для вашего класса case. Вы уверены, что 'Filter' относится к классу * case *, а не к классу или признаку? – thesamet

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