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

时间:2014-10-02 18:09:26

标签: scala spray spray-json

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

示例:

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

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

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

1 个答案:

答案 0 :(得分:6)

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

import spray.json._

def convertToJson // ...

然后,spray-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

前者是后者的语法糖。

<强>更新

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

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

这正是toJson正在做的事情。