首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用slick-codegen创建的case类自动进行JSON编码/解码

使用slick-codegen创建的case类自动进行JSON编码/解码
EN

Stack Overflow用户
提问于 2019-05-15 23:55:08
回答 1查看 257关注 0票数 0

我使用slick-codegen从数据库生成了我的scala模型。现在Json映射器的生成失败了。我怎样才能避免所有的事情都是手工做的?

圆圈:

代码语言:javascript
复制
could not find implicit value for parameter encoder: io.circe.Encoder[UserController.this.db.UsersRow

play-json:

代码语言:javascript
复制
implicit val userFormat = Json.format[models.Tables#UsersRow]
No unapply or unapplySeq function found for class UsersRow: <none> / <none>

slick-codegen生成的代码如下所示:

代码语言:javascript
复制
package models

object Tables extends {
  val profile = slick.jdbc.PostgresProfile
} with Tables

trait Tables {
  val profile: slick.jdbc.JdbcProfile
  import profile.api._

  case class UsersRow(id: Int, username: String)
  //lots more code
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 14:38:02

您可以使用自己的SourceCodeGenerator为每个case类创建一个circe隐式半自动派生。

https://circe.github.io/circe/codecs/semiauto-derivation.html

代码应该看起来像...

代码语言:javascript
复制
new slick.codegen.SourceCodeGenerator(model){
  val importCirce =
    "import io.circe.Encoder\nimport io.circe.generic.semiauto._"

  val implicits = model.tables.map(t => {
    val name = entityName(t.name.table)
    s"implicit val ${name}Encoder: Encoder[${name}] = deriveEncoder[${name}]\n"
  }).mkString("\n")

  override def code: String =
    super.code + "\n" + importCirce + "\n\n" + implicits
}

创建模型后,解码器或编码器就已经可用了

代码语言:javascript
复制
import models.Tables._

val user = new User("Peter", 1)
println {
  user.asJson
}

你可以在这里查看完整的例子https://github.com/jgoday/scala-slick-customcodegen

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56153365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档