2014-10-02 3 views
2

У меня есть функция, которая примет параметр некоторого типа, преобразует этот параметр в Json и затем возвращает его. Проблема здесь в том, что моя функция не может вызвать .toJson по параметру, потому что она не знает об этом.Как создать функцию, которая будет принимать только типы, которые могут быть преобразованы в Json с помощью spray-json

Пример:

def convertToJson[A](toConvert: A): JsValue = 
    toConvert.toJson 

Это, очевидно, не работает, но мне интересно, как я мог бы сделать что-то похожее на эту работу? Как я могу обобщить эту функцию для работы со всеми мои сериализуемыми классами классов? Существует не какой-то объединяющий тип, который я мог бы добавить, который позволил бы этой функции принять весь сериализуемый класс case.

Если требуется дополнительная информация или требуется более подробное объяснение, пожалуйста, дайте мне знать.

ответ

6

Метод toJson обеспечиваются неявным расширением PimpedAny, который вы должны импортировать:

import spray.json._ 

def convertToJson // ... 

Затем распыление JSON использует spray.json.JsonWriter[A] класса типов, чтобы определить, что может быть сериализации. Вы должны предоставить доказательства, что ваш A можно посмотреть как JsonWriter[A]. Есть два способа сделать это:

def convertToJson[A: JsonWriter](toConvert: A): JsValue = 
    toConvert.toJson 

и

def convertToJson[A](toConvert: A)(implicit writer: JsonWriter[A]): JsValue = 
    toConvert.toJson 

С бывшим будучи синтаксическим сахаром для последнего.

Update:

Вы также можете пропустить расширение toJson и использовать JsonWriter непосредственно:

def convertToJson[A](toConvert: A)(implicit writer: JsonWriter[A]): JsValue = 
    writer.write(toConvert) 

, который будет точно то, что toJson делает.