2

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

例子:

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

这显然是行不通的,但我想知道我怎样才能做出与这项工作类似的东西?我如何推广这个函数来处理我所有的可序列化案例类?我没有可以添加的统一类型允许此函数接受所有可序列化的案例类。

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

4

1 回答 1

6

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

import spray.json._

def convertToJson // ...

然后,spray-json 使用spray.json.JsonWriter[A]typeclass 来确定,可以序列化什么。您必须提供证据,证明您A可以被视为JsonWriter[A]. 有两种方法可以做到这一点:

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

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

前者是后者的语法糖。

更新

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

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

这将是确切的,toJson正在做什么。

于 2014-10-02T18:22:50.253 回答