2016-11-26 10 views
1

Ich muss ein Json-Feld als eine Spalte meines Play Framework-Modells speichern. Meine Tabelle Parser in DAO istScala + Play Framework + Slick - Json als Modellfeld

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 als Fall Klasse in Modell im Play-Modell Ordner definiert ist und sein Begleiter Objekt. Feld dieses Objekts sind Int, Double oder 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 ist, ich nicht aufgrund dieses Fehlers kompilieren

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

Gibt es eine Möglichkeit, die Config-Modell als Json in der Tabelle zu speichern (es als Config lesen)?

Antwort

1

Sie müssen Slick sagen, wie Sie Ihre Config Instanzen in Datenbankspalten konvertieren:

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] 
) 
+0

Es funktioniert, danke. Denken Sie, dass es am besten ist, die Spalte in JSON oder Text zu speichern? – emmea90

+0

Ich würde sie als JSON speichern. Dafür gibt es zwei Gründe: 1. Ihre DB-Engine würde die Gültigkeit von JSON-Werten erzwingen, die in diese Spalte eingefügt wurden. 2. Wenn Sie diese Werte als JSONs speichern, können Sie zusätzliche JSON-spezifische Funktionen und Operatoren für diese Spalte verwenden. –

Verwandte Themen