У меня возникают некоторые проблемы с получением элементов в родительской черте от распознавания дочерними классами, когда я выполняю маршалл в json.
Я хочу создать группу отдельных детей, которые наследуют от общего родителя. Как это:
trait Parent
case class ChildA(field1: Int) extends Parent
case class ChildB(field1: Int, field2: Int) extends Parent
Parent
имеет несколько общих полей:
trait Parent {
val parentValue: BigDecimal = ??? // This value may be obtained through a database call
val adjusted = {
if (parentValue > 5) { parentValue * 0.12 }
else { parentValue }
}
}
Когда я выполняю маршал Json, я определяю собственный jswriter:
case class ChildA(field1: Int)
// companion obj
object ChildA {
implicit val jsWriter = new Writes[ChildA] {
def writes(model: ChildA): Jsvalue = {
Json.obj(
"parent" -> model.parentValue,
"child-type" -> model.getClass.getSimpleName,
"child-field-1" -> model.field1, // for ChildB, there would need to be a child-field-2
"adjusted" -> model.adjusted
)
}
}
(Дополнительный вопрос, но как мне заставить детей наследовать родительский json-писатель, чтобы я мог написать JsWriter для родительского и просто добавить дочерние поля без необходимости писать собственный маршаллер для каждого дочернего элемента?)
Я могу сделать это для json следующим образом:
val a = ChildA(6)
Json.toJson[ChildA](a)
Но в конечном итоге я хотел бы создать общий вывод, чтобы я мог сделать что-то вроде этого:
val a = ChildA(6)
val b = ChildB(6, 7)
Json.toJson[Parent](a) // json of ChildA
Json.toJson[Parent](b) // json of ChildB
Я чувствую, что это возможность использовать более родовые или общие типы. Кто-нибудь может показать мне, как это можно сделать?