【问题标题】:Scala Circe cannot decode model with list as memberScala Circe 无法解码以列表为成员的模型
【发布时间】:2019-05-31 06:03:01
【问题描述】:

我有一个模型,其中包含一个列表作为成员变量,我正在尝试使用 Circe in Scale 对其进行序列化。

有问题的模型 -

case class Order(id: Long, tableId: Long, items: List[Item]) {

}

object Order {
  implicit val encoder: Encoder[Order] = deriveEncoder[Order]

  implicit val decoder: Decoder[Order] = deriveDecoder[Order]
}

还有,Item 类 -

case class Item(id: Long, name: String, serving: String) {

}

object Item {
  implicit val encoder: Encoder[Item] = deriveEncoder[Item]

  implicit val decoder: Decoder[Item] = deriveDecoder[Item]
}

我正在使用 Circe 的半自动编码器功能。但是,当尝试使用 quill 从数据库中读取数据时,我遇到了这个异常 -

[error] /Users/in-rmoitra/Projects/PetProjects/Restrofit-Backend/src/main/scala/models/repository/OrderRepository.scala:17:69: exception during macro expansion:
[error] scala.reflect.macros.TypecheckException: Can't find implicit `Decoder[List[models.Item]]`. Please, do one of the following things:
[error] 1. ensure that implicit `Decoder[List[models.Item]]` is provided and there are no other conflicting implicits;
[error] 2. make `List[models.Item]` `Embedded` case class or `AnyVal`.
[error]
[error]     at scala.reflect.macros.contexts.Typers.$anonfun$typecheck$3(Typers.scala:32)
[error]     at scala.reflect.macros.contexts.Typers.$anonfun$typecheck$2(Typers.scala:26)
[error]     at scala.reflect.macros.contexts.Typers.doTypecheck$1(Typers.scala:25)
[error]     at scala.reflect.macros.contexts.Typers.$anonfun$typecheck$7(Typers.scala:38)
[error]     at scala.reflect.internal.Trees.wrappingIntoTerm(Trees.scala:1731)
[error]     at scala.reflect.internal.Trees.wrappingIntoTerm$(Trees.scala:1728)
[error]     at scala.reflect.internal.SymbolTable.wrappingIntoTerm(SymbolTable.scala:18)
[error]     at scala.reflect.macros.contexts.Typers.typecheck(Typers.scala:38)
[error]     at scala.reflect.macros.contexts.Typers.typecheck$(Typers.scala:20)
[error]     at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
[error]     at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
[error]     at io.getquill.context.QueryMacro.expandQueryWithMeta(QueryMacro.scala:41)
[error]     at io.getquill.context.QueryMacro.expandQuery(QueryMacro.scala:20)
[error]     at io.getquill.context.QueryMacro.runQuery(QueryMacro.scala:12)
[error]     val ordersFuture: Future[List[(Order, (OrderItem, Item))]] = run(query)

根据我对 Circe 的有限知识和我已经查找的内容,文档说如果您已经有 [A] 的解码器,则不需要为 List[A] 创建解码器。

如果有人能阐明这里似乎正在发生的事情,那就太好了。

【问题讨论】:

    标签: scala serialization deserialization quill decoder


    【解决方案1】:

    您的 Circe 代码没问题。如果你执行

    println(
          parse("""
                  |{ "id" : 1,
                  |  "tableId" : 2,
                  |  "items" : [
                  |     { "id": 3,
                  |       "name" : "a",
                  |       "serving" : "b"
                  |     },
                  |     { "id": 4,
                  |       "name" : "c",
                  |       "serving" : "d"
                  |     }
                  |  ]
                  |}
                """.stripMargin)
            .flatMap(json => json.as[Order])
        )
    

    你会得到

    Right(Order(1,2,List(Item(3,a,b), Item(4,c,d))))
    

    所以问题在于您的 Quill 代码。

    不要混淆io.circe.Decoderio.getquill.context.jdbc.Decoders#Decoder

    https://getquill.io/#extending-quill-custom-encoding

    `exception during macro expansion: [error] scala.reflect.macros.TypecheckException` when using quill

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 2021-11-11
      • 2020-07-06
      • 2021-09-21
      • 2017-07-06
      • 2021-04-24
      • 2018-02-14
      • 2017-05-24
      • 2020-05-03
      相关资源
      最近更新 更多