2015-05-17 2 views
0

Для этого вызова функции:Как пройти Любой объект как Json Записываемый в Scala?

fakeRequest(controllers.routes.GPInviteService.invite, Json.toJson(i)) 

, который определяется как:

def fakeRequest(target:() => Call, json: JsValue): Any 

Я хотел бы, чтобы упростить код вызова, и устранить необходимость создания объекта JSON. Таким образом, вызов стал бы:

fakeRequest(controllers.routes.GPInviteService.invite, i) 

И функция стали бы тогда:

def fakeRequest(target:() => Call, i: Any): Any = { 
    route(FakeRequest(target()).withJsonBody(Json.toJson(i))) match { 
                 ^
    ... 

Но это заставляет меня ошибку компиляции, потому что toJson() хочет Пишет [A] типа. Я недостаточно знаком с Scala и библиотекой Json, чтобы выяснить, как я могу передать по существу любой объект для i, учитывая, что он должен реализовывать неявные Writes. (Я пробовал пройти i: Writes, но это не работает).

+1

Не может работать, потому что 'Any' не имеет любую полезную информацию о типе. Как насчет параметризации 'fakeRequest'? например. 'def fakeRequest [A] (target:() => Call, i: A) (неявный w: Writes [A]): ​​A = ???' –

+0

Я не понимаю этот синтаксис ... но после Немного возиться, я получил его на работу. Я отправлю свой ответ ниже. – Zac

+0

Кто-то избил меня. '(Неявный w: Writes [A]): ​​A = ???' не работает, но я думаю, возможно, вы не имели в виду буквально включить «???» а скорее моя функция. Но это сработало: 'def fakeRequest [A] (target:() => Call, i: A) (неявный w: Записывает [A]): ​​Any = {...}' так что спасибо! Лучшие оценки для @ daniel-c-sobral для ясности и простоты. – Zac

ответ

1

ли это:

def fakeRequest[A: Writes](target:() => Call, i: A): Any = { 

Вызов функции в Json.toJson, в соответствии с сообщением об ошибке, имеет неявный параметр типа Writes[A] для параметра типа A. Самое главное, это означает, что вы не можете пройти Any - тип должен быть быть статически известным в точке, вызываемой методом, и Writes[A] делает эту информацию доступной во время выполнения (поскольку параметры типа стираются).

Синтаксис [A: Writes] сообщает Scala, что вы хотите неявный параметр типа Writes[A], в дополнение к нормальным параметрам. Затем это неявное будет передано по вызову Json.toJson.

+0

Удивительный! Спасибо, оцените объяснение Scala. Все еще обучение ... – Zac

1

Может быть что-то вроде:

def fakeRequest[A](target:() => Call, i: A)(implicit writes: Writes[A]): A = { ... 

Таким образом, вы можете пройти любой А, при условии, что вы также передать неявно Пишет экземпляр для него (способ упорядочивания его). Или вы можете определить Writes для Any (я не уверен, как вы можете это сделать, это означает, что у вас есть сериализатор для любого возможного объекта) и следуйте за ответом Даниэля

+0

Спасибо, что поняли, что я понимаю подсказки на синтаксисе Scala. Все еще учусь... – Zac

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