Circe: 缺少编码器/解码器时出现无用的编译错误

创建于 2015-08-15  ·  3评论  ·  资料来源: circe/circe

如果日期没有编码,则编译器会抱怨

 [error] /home/jilen/workspace/jfc-test/src/main/scala/Foo.scala:26: diverging implicit expansion for type io.circe.Encoder.Secondary[this.Out]
[error] starting with method encodeCaseClass in trait GenericInstances

有没有机会改进错误报告?

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

import java.util.Date
case class Foo(
  date: Date,
  number: Int,
  str: String)

object App {

  def encodesDate(fmt: String): Encoder[Date] = new Encoder[Date] {
    def apply(a: Date) = {
      val sdf = new java.text.SimpleDateFormat(fmt)
      Json.string(sdf.format(a))
    }
  }



  def main(args: Array[String])  {
    //implicit val DateEncodes = encodesDate("yyyy-MM-dd HH:mm:ss")
    val f = Foo(new Date, 1, "fff")
    println(f.asJson.noSpaces)
  }
}

最有用的评论

+1 使用implicitNotFound !
解码和编码日期,只是隐式

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

由于日期有多种格式,我建议在文档中定义它,不要在 jfc 中添加默认格式。

所有3条评论

是的,这是一个非常糟糕的错误信息——感谢您指出。

通用派生机制的实现将随着#30 发生变化,我希望明天能完成,所以在尘埃落定之后,我将重新审视这个和#34,因为到那时情况可能会有所不同。 我们应该能够在一些地方使用@implicitNotFound来改进这些消息(例如,参见 Finch 中的这条消息)。

+1 使用implicitNotFound !
解码和编码日期,只是隐式

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

由于日期有多种格式,我建议在文档中定义它,不要在 jfc 中添加默认格式。

我将继续并关闭它,因为以下是一个巨大的改进:

<console>:59: error: could not find implicit value for parameter e: io.circe.Encoder[Foo]
           println(f.asJson.noSpaces)
                     ^

我实际上不确定在这种情况下我们可以使用@implicitNotFound添加更多有用的信息,除了可能指向文档的指针。

此页面是否有帮助?
0 / 5 - 0 等级