Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将任何对象作为可在Scala中写入的Json进行传递?_Json_Scala - Fatal编程技术网

如何将任何对象作为可在Scala中写入的Json进行传递?

如何将任何对象作为可在Scala中写入的Json进行传递?,json,scala,Json,Scala,对于此函数调用: fakeRequest(controllers.routes.GPInviteService.invite, Json.toJson(i)) 定义为: def fakeRequest(target: () => Call, json: JsValue): Any 我希望简化调用代码,并消除创建Json对象的需要。因此,呼吁将变成: fakeRequest(controllers.routes.GPInviteService.invite, i) 然后,功能将变为:

对于此函数调用:

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()需要Writes[a]类型。我对Scala和Json库还不够熟悉,无法理解如何为I传入任何对象,因为它必须实现隐式写入。(我试着传递
I:Writes
,但这不起作用)。

执行以下操作:

def fakeRequest[A: Writes](target: () => Call, i: A): Any = {
根据错误消息,对
Json.toJson
的函数调用采用
类型的隐式参数Writes[A]
,作为
A
类型的参数。最重要的是,这意味着您不能传递
Any
——类型必须在调用方法时静态已知,并且
写入[A]
使该信息在运行时可用(因为类型参数被擦除)

语法
[A:Writes]
告诉Scala,除了正常参数之外,您还需要一个类型为
Writes[A]
的隐式参数。然后,该隐式表达式将传递给调用
Json.toJson

可能类似于:

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

通过这种方式,您可以传递任何A,前提是您还隐式地传递它的Writes实例(一种序列化它的方式)。或者你可以为任何对象定义一个写操作(我不确定你怎么做,这意味着对任何可能的对象都有一个序列化程序),然后按照Daniel的回答执行,因为
Any
没有任何有用的类型信息,所以不能工作。把fakeRequest参数化怎么样?例如,
def fakeRequest[A](目标:()=>Call,i:A)(隐式w:Writes[A]):A=???
。。。但是,经过一点修补,我让它开始工作了。我会把我的答案贴在下面。有人抢先给了我答案。
(隐式w:Writes[A]):A=???
不起作用,但我想也许你的意思不是字面上包含“?”,而是包含我的函数。但这确实有效:
def fakeRequest[A](target:()=>Call,i:A)(隐式w:Writes[A]):Any={…}
谢谢!@daniel-c-sobral的最高分是为了清晰和简单。谢谢你澄清这一点,我很欣赏有关Scala语法的提示。还在学习。。。