Encoding/Decode 带圆圈的无形记录

Encoding/Decode shapeless records with 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]                                              ^

我是不是遗漏了一些导入内容,还是这些 encoders/decoders 在 circe 中不再可用?

Shapeless 的 hlists、记录等的实例在 circe 0.6.0 版本中被移动到一个单独的 circe-shapes 模块。如果您将此模块添加到您的构建中,则以下应该可以正常工作:

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-shapes 模块还包括 circe-generic 中不可用的功能,例如联积实例。