Ich baue eine Webanwendung mit Scala/Play Framework und Reactive Mongo und möchte, dass die Modelle in der Datenbank definiert werden sie hart codieren lassen. so zu tun, ich bin eine Klasse EntityInstance Schreiben eine Sequenz von FieldInstance unter:ScalaJson impliziter Schreibvorgang, gefunden: Beliebig erforderlich: play.api.libs.json.Json.JsValueWrapper
case class EntityInstance(fields: Seq[FieldInstance])
I Felder von irgendwelchen Typen zu akzeptieren, ich versuche, und sie zu Json zu konvertieren: Beispiel
new FieldInstance("name", "John") | json: { "name": "John" }
new FieldInstance("age", 18) | json: { "age": 18 }
Bei der Moment versuche ich, Streicher, Boolesche Werte und Ganze Zahlen zu akzeptieren und, wenn der Typ nicht unterstützt wird schreibe ich einige Fehler:
new FieldInstance("profilePicture", new Picture("john.jpg") | json: { "profilePicture": "Unsupported type
ich schrieb eine FieldInstance Klasse ta king ein FieldName als String und einen Wert als einen beliebigen Typ. Sobald diese Klasse instanziiert wird, übergebe ich den Wert auf einen bekannten Typ oder auf den String, der den Fehler beschreibt.
class FieldInstance(fieldNamec: String, valuec: Any) {
val fieldName = fieldNamec
val value = valuec match {
case v: Int => v
case v: String => v
case v: Boolean => v
case _ => "Unrecognized type"
}
}
object FieldInstance {
implicit val fieldInstanceWrites = new Writes[FieldInstance] {
def writes(fieldInstance: FieldInstance) = Json.obj(
fieldInstance.fieldName -> fieldInstance.value
)
}
}
habe ich ein Begleitobjekt mit einem impliziten Schreibe JSon so kann ich „Json.toJson()“ auf eine Instanz von FieldInstance anrufen und eine json erhalten, wie oben auf meine Beispiele beschrieben.
Ich erhalte einen Fehler: found: Any required: play.api.libs.json.Json.JsValueWrapper
Ich verstehe, dass es von der Tatsache kommt, dass mein Wert vom Typ Any ist, aber ich dachte, der Cast würde Any zu String || ändern Boolesch || Int vor dem Schlagen des Verfassers.
PS: Ignorieren Sie die schlechte Benennung der Klassen, ich konnte EntityInstance und FieldInstance, Entity und Field nicht nennen, da dies die Klassen sind, die ich verwende, um meine Modelle zu beschreiben.
Schreibt kann jeden Scala-Typ annehmen, zum Beispiel kann er mein fieldName-Attribut analysieren, das Problem hier ist, dass der Wert immer noch vom Typ Any ist, wenn er vom Typ Int/String oder Boolean sein sollte. – Daniel