喷 JSON 格式和转换错误

Spray JSON Format and Conversion Error

我有一个特征,我想为其编写 Typeclasses。这个 trait 实际上是一个将 JSON 转换为 Case class 的契约,反之亦然。 trait的定义如下:

trait Converter[T] {
    def convertFromJson(msg: String): Either[ConverterError, T]
    def convertToJson(msg: T): String
}

现在,对于我遇到的 class 个案例,我定义了这样的实现:

object Converter extends DefaultJsonProtocol {

        implicit object DefaultMessageConversions extends Converter[DefaultMessage] {
            implicit val json = jsonFormat(DefaultMessage, "timestamp")

            def convertFromJson(msg: String): Either[ConverterError, DefaultMessage] = {
                try {
                    Right(msg.parseJson.convertTo[DefaultMessage])
                }
                catch {
                    case _: Exception => Left(ConverterError("Shit happens"))
                }
            }
            def convertToJson(msg: DefaultMessage) = {
                implicit val writes = Json.writes[DefaultMessage]
                Json.toJson(msg).toString
            }
        }

        def apply[T: Converter] : Converter[T] = implicitly
    }

但是我 运行 在尝试构建我的项目时遇到了一些编译器错误。我不确定我做错了什么?

[error] /Users/joesan/ingestion/src/main/scala/com/my/project/common/JsonMessageConversion.scala:28: could not find implicit value for evidence parameter of type com.my.project.common.JsonMessageConversion.Converter.JF[org.joda.time.DateTime]
[error]             implicit val json = jsonFormat(DefaultMessage, "timestamp")

这是我的案例 class 的样子:

  case class DefaultMessage(timestamp: DateTime) extends KafkaMessage {
    def this() = this(DateTime.now(DateTimeZone.UTC))
  }

您的 DefaultMessage 使用 org.joda.time.DateTime 和 spray-json 不知道如何 serialize/deserialize 开箱即用。

因此您需要定义一个 RootJsonFormat[DateTime] 并将其引入隐式范围。

Here 是一个示例实现。