emmea90 emmea90 - 8 months ago 56
JSON Question

Scala + Play Framework + Slick - Json as Model Field

I need to save a Json Field as a column of my Play Framework Model. My table parser in DAO is

class Table(tag: Tag) extends Table[Model](tag, "tablename") {
implicit val configFormat = Json.format[Config]

// Fields ...
def config = column[Config]("config", O.SqlType("JSON"))
// Fields ...

}


Config
is defined as a case class in Model in Play Model folder and has his companion object. Field of this object are Int, Double or String

case class Config ( // fields )

object Config {
implicit val readConfig: Reads[Config] = new Reads[Config]
for {
// fields
} yield Config(// fields)

implicit val configFormat = Json.format[Config]

}


Problem is i can't compile due to this error

Error:(28, 37) could not find implicit value for parameter tt:
slick.ast.TypedType[models.Config]
def config = column[Config]("config", O.SqlType("JSON"))


Is there a way to save the Config model as Json in the Table (reading it as Config)?

Answer Source

You need to tell Slick how to convert your Config instances into database columns:

implicit val configFormat = Json.format[Config]
implicit val configColumnType = MappedColumnType.base[Config, String](
  config => Json.stringify(Json.toJson(config)), 
  column => Json.parse(column).as[Config]
)