Как получить значения родительской черты, которые будут отображаться в дочернем классе case при сортировке в json? - PullRequest
0 голосов
/ 30 августа 2018

У меня возникают некоторые проблемы с получением элементов в родительской черте от распознавания дочерними классами, когда я выполняю маршалл в 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

Я чувствую, что это возможность использовать более родовые или общие типы. Кто-нибудь может показать мне, как это можно сделать?

1 Ответ

0 голосов
/ 30 августа 2018

Но вы не унаследовали ChildA и B от Parent. case class ChildA(field1: Int) extends Parent

...