Mi piacerebbe produrre JSON per un elenco che include sia classi base che classi derivate. Il codice seguente produce solo JSON per la classe Animal (non ottengo il campo di razza per i membri del tipo Dog). Qualche aiuto sarebbe apprezzato.Scala Play framework classi derivate 2.1
import play.api.libs.json._
class Animal (val name:String) {
}
object Animal {
implicit object animalWrite extends Writes[Animal] {
def writes(ts: Animal) = JsObject(Seq("name" -> JsString(ts.name)))
}
}
case class Dog (override val name:String, val breed: String)
extends Animal(name) {
}
object Dog {
implicit val format = Json.format[Dog]
}
case class Cat (override val name:String, val hairLength: Int)
extends Animal(name) {
}
object Cat {
implicit val format = Json.format[Cat]
}
object helloWorld extends App {
// The list below outputs: [{"name":"Ruff","breed":"labrador"}]
// val l = List[Dog](Dog("Ruff", "labrador"))
// The list below outputs: [{"name":"Ruff"},{"name":"Fluffy"}]
// I expect to see: [{"name":"Ruff","breed":"labrador"},{"name":"Fluffy","hairLength":3}]
val l = List[Animal](Dog("Ruff", "labrador"), Cat("Fluffy", 3))
println(Json.toJson(l))
}
Scala e Play newbie qui, per favore scusa uso inappropriato della terminologia.
Grazie johanandren. Questo è utile, ho pensato che il problema avesse a che fare con impliciti ma non ho capito come. Quello che ho fatto per risolvere il problema era implementare un metodo serialize in Dog and Cat che chiama 'Json.toJson (this)' e chiamarlo con 'l.map (_. Serialize) .mkString (" [",", ","] ")'. Il tuo è meglio perché non hai dovuto concatenare manualmente Json insieme come ho fatto io. Grazie. – ariscris
is'nt meglio aggiungere una funzione toJSON in strega animali potrebbero essere attuate come quella '' ' caso classe Dog (sovrascrivere nome val: String, razza val: String) estende animali (nome) { def toJSON = JSON.TOJSON (this) '' ' – crak
In genere si evita di farlo in quanto si mescolerebbe e accoppierà strettamente il modello di dominio con i dettagli di implementazione di una forma di serializzazione mentre le classi di tipi che riproducono json utilizza in genere ben disaccoppiamenti Questo. – johanandren