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を使用します!
日付をデコードおよびエンコードするには、juestimplicit

  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を使用します!
日付をデコードおよびエンコードするには、juestimplicit

  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 評価