Кодирование / декодирование бесформенных записей с помощью Circe
Обновление Circe с 0.4.1 до 0.7.0 сломало следующий код:
import shapeless._
import syntax.singleton._
import io.circe.generic.auto._
.run[Record.`'transaction_id -> Int`.T](transport)
def run[A](transport: Json => Future[Json])(implicit decoder: Decoder[A], exec: ExecutionContext): Future[A]
Со следующей ошибкой:
could not find implicit value for parameter decoder: io.circe.Decoder[shapeless.::[Int with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("transaction_id")],Int],shapeless.HNil]]
[error] .run[Record.`'transaction_id -> Int`.T](transport)
[error] ^
Я пропускаю какой-то импорт или эти кодеры / декодеры больше не доступны в circe?
1 ответ
Экземпляры для списков, записей и т. Д. Shapeless были перенесены в отдельный модуль circe-shape в выпуске circe 0.6.0. Если вы добавите этот модуль в вашу сборку, следующее должно просто работать:
import io.circe.jawn.decode, io.circe.shapes._
import shapeless._, record.Record, syntax.singleton._
val doc = """{ "transaction_id": 1 }"""
val res = decode[Record.`'transaction_id -> Int`.T](doc)
Мотивация для перемещения этих экземпляров заключалась в том, что улучшенный обобщенный деривация, введенный в 0.6, означал, что они больше не нужны, а сохранение их вне неявной области действия, когда они не нужны, является более чистым и потенциально поддерживает более быстрое время компиляции. Новый модуль circe-shape также включает функции, которые не были доступны в circe-generic, такие как экземпляры для сопутствующих продуктов.