在特质中圈出json泛型

时间:2017-08-12 20:29:51

标签: json scala

我有几个与exacly相同的案例类:

def toJson : String = this.asJson.deepMerge(Json.obj(("type", Json.fromString(`type`)))).noSpaces

我想把这一部分转移到特质上。 例如:

trait Test[A] {
  implicit val encoder: Encoder[A]
  def jsonWithType[A] = this.asJson.noSpaces
}

但是这当然给我一个错误:

could not find implicit value for parameter encoder: io.circe.Encoder[io.outofaxis.pixelart.player.server.application.model.Test[A]]

是否有可能实现我的目标?

编辑:

我找到了解决办法,在我需要那些jsons的对象中:

implicit def asJsonWithTypeNoSpaces[A <: SomeEvent](obj: A)(implicit encoder: Encoder[A]): String = {
    obj.asJson.deepMerge(Json.obj(("type", Json.fromString(obj.`type`)))).noSpaces
  }

工作正常

1 个答案:

答案 0 :(得分:0)

实现所需内容的最简单方法是将隐式约束移动到您的方法中,并删除其他val。毕竟你可能已经在某个地方定义了它,为什么强迫不必要的override

trait Test[A] {

  // Equivalently def jsonWithType[A](implicit encoder: Encoder[A])
  def jsonWithType[A : Encoder] = this.asJson.noSpaces

}

如果你真的必须满足你的覆盖需求,你也可以直接传入你的编码器。请记住:可以明确地满足隐式参数。

trait Test[A] {

  val encoder: Encoder[A]

  def jsonWithType[A] = this.asJson(encoder).noSpaces

}