如何创建一个只接受可以用spray-json转换为Json的类型的函数

use*_*260 2 scala spray spray-json

我有一个函数,它将采用某种类型的参数,将该参数转换为Json然后返回它.这里的问题是我的函数不能在参数上调用.toJson,因为它不知道它.

例:

def convertToJson[A](toConvert: A): JsValue = 
  toConvert.toJson
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,但我想知道我怎么能做出类似这项工作的东西?我怎么能推广这个函数来处理我所有可序列化的案例类?我可以添加一些统一类型,允许此函数接受所有可序列化的案例类.

如果需要更多信息或需要更好的解释,请告诉我.

knu*_*ker 6

toJson方法由隐式扩展提供PimpedAny,您必须导入该扩展:

import spray.json._

def convertToJson // ...
Run Code Online (Sandbox Code Playgroud)

然后,spray-json使用spray.json.JsonWriter[A]类型类来确定可序列化的内容.你必须提供证据,证明你A可以被视为一个JsonWriter[A].有两种方法可以做到这一点:

def convertToJson[A: JsonWriter](toConvert: A): JsValue = 
  toConvert.toJson
Run Code Online (Sandbox Code Playgroud)

def convertToJson[A](toConvert: A)(implicit writer: JsonWriter[A]): JsValue = 
  toConvert.toJson
Run Code Online (Sandbox Code Playgroud)

前者是后者的语法糖.

更新:

您也可以跳过toJson扩展名并JsonWriter直接使用:

def convertToJson[A](toConvert: A)(implicit writer: JsonWriter[A]): JsValue = 
  writer.write(toConvert)
Run Code Online (Sandbox Code Playgroud)

这究竟toJson是做什么的.