一尘不染

Scala Circe与泛型

json

我正在尝试使用scala json库Circe,将其包装在一个简单的特征中以提供往返于json的转换,我对此具有以下要求:

import io.circe.generic.auto._
import io.circe.parser._
import io.circe.syntax._

trait JsonConverter {
  def toJson[T](t : T) : String
  def fromJson[T](s: String) : T
}

case class CirceJsonConverter() extends JsonConverter{
  override def toJson[T](t: T): String = t.asJson.noSpaces
  override def fromJson[T](s: String): T = decode[T](s).getOrElse(null).asInstanceOf[T]
}

这样做的目的是简单地能够用任何对象调用JsonConverter并将其转换成json之类的东西jsonConverter.toJson(0) must equalTo("0"),但是当我尝试对其进行编译时,我得到以下信息:

[error] could not find implicit value for parameter encoder: io.circe.Encoder[T]
[error]   override def toJson[T](t: T): String = t.asJson.noSpaces
[error]                                            ^
[error] could not find implicit value for parameter decoder: io.circe.Decoder[T]
[error]   override def fromJson[T](s: String): T = decode[T](s).getOrElse(null).asInstanceOf[T]
[error]                                                     ^
[error] two errors found

我当然可以拥有一个类,打算通过转换器放入的所有内容都继承自该类,但是我有一个印象,大约可以自动生成编码器/解码器?


阅读 456

收藏
2020-07-27

共1个答案

一尘不染

除非您可以实施将任何对象转换为Json的策略,否则您想要的东西就不会起作用。瑟茜(和许多其他库),而不是选择使用名为类型类的通用模式,使其方便地定义你如何想要做的事,在这种情况下Encoder/
Decoder,对于一个 特定的类型

如果您不熟悉类型类,我建议您对其进行研究。然后查看Circe文档,了解如何专门实现编码器/解码器。

2020-07-27