Circe: Kesalahan kompilasi yang tidak berguna saat kekurangan encoder/decoder

Dibuat pada 15 Agu 2015  ·  3Komentar  ·  Sumber: circe/circe

Jika tidak ada penyandian untuk tanggal, maka kompiler mengeluh

 [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

Apakah ada peluang untuk memperbaiki pelaporan kesalahan?

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)
  }
}

Komentar yang paling membantu

+1 untuk menggunakan implisitNotFound !
Untuk mendekode dan menyandikan tanggal, cukup implisit

  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(_)))

Karena tanggal memiliki banyak format, saya sarankan untuk mendefinisikannya dalam dokumentasi dan jangan menambahkan format default di jfc.

Semua 3 komentar

Ya, itu pesan kesalahan yang sangat buruk—terima kasih telah menunjukkannya.

Implementasi mekanisme derivasi generik akan berubah dengan #30, yang saya harap bisa selesai besok, jadi setelah debu itu mengendap, saya akan meninjau kembali ini dan #34, karena hal-hal mungkin akan sedikit berbeda saat itu. Kita seharusnya dapat menggunakan @implicitNotFound di beberapa tempat untuk meningkatkan banyak pesan ini (lihat misalnya pesan ini di Finch).

+1 untuk menggunakan implisitNotFound !
Untuk mendekode dan menyandikan tanggal, cukup implisit

  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(_)))

Karena tanggal memiliki banyak format, saya sarankan untuk mendefinisikannya dalam dokumentasi dan jangan menambahkan format default di jfc.

Saya akan melanjutkan dan menutup ini karena berikut ini adalah peningkatan besar:

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

Saya sebenarnya tidak yakin ada banyak informasi berguna tambahan yang dapat kami tambahkan dengan @implicitNotFound dalam kasus ini, selain mungkin penunjuk ke dokumen.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat