Scala Circe无法解码列表为成员的模型
我有一个模型,其中包含一个列表作为成员变量,我正试图在Scale中使用Circe对其进行序列化 有关的模式—Scala Circe无法解码列表为成员的模型,scala,serialization,deserialization,quill,decoder,Scala,Serialization,Deserialization,Quill,Decoder,我有一个模型,其中包含一个列表作为成员变量,我正试图在Scale中使用Circe对其进行序列化 有关的模式— case class Order(id: Long, tableId: Long, items: List[Item]) { } object Order { implicit val encoder: Encoder[Order] = deriveEncoder[Order] implicit val decoder: Decoder[Order] = deriveDec
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]
}
此外,项目类别—
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]的解码器,则不需要为列表[a]创建解码器
如果有人能把这里发生的事情弄清楚,那就太好了 您的电路代码很好。如果你执行
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))))
所以问题在于你的羽毛笔代码
不要混淆io.circe.Decoder
和io.getquill.context.jdbc.Decoders#Decoder
您的电路代码很好。如果你执行
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))))
所以问题在于你的羽毛笔代码
不要混淆io.circe.Decoder
和io.getquill.context.jdbc.Decoders#Decoder