我有一个班级的人和一个班级的雇员。班级员工扩展了班级人员。
我当前将类转换为JSON的隐式写入如下所示:
implicit val implicitPersonWrites = new Writes[Person] {
def writes(v: Person): JsValue = {
Json.obj("label" -> v.label, "age" -> v.age)
}
}
implicit val implicitEmployeeWrites = new Writes[Employee] {
def writes(v: Employee): JsValue = {
Json.obj("label" -> v.label, "age" -> v.age, "company" -> v.company)
}
}
问题在于,即使我的对象是Employee类型,也始终使用Person超类的隐式写入。因此,最后,输出中不存在特定于Employee类的字段。在继承的情况下如何正确进行隐式写入?
三种选择:
(在大多数情况下最好)使用合成代替继承。而不是class Employee(...) extends Person(...))
拥有class Employee(person: Person, company: String)
。
如果您具有固定的子类层次结构,那么正如您在注释中提到的,请分派in中的类型implicitPersonWrites
。这不是特别丑陋。总是在Option
,List
等等发生这种情况。理想情况下,您可以将其Person
转换为代数数据类型。
使用您拥有的继承:
implicit val implicitPersonWrites = new Writes[Person] {
def writes(v: Person): JsValue = v.toJsValue
}
// no implicitEmployeeWrites
class Person(...) {
def toJsValue = Json.obj("label" -> label, "age" -> age)
}
class Employee(...) extends Person(...) {
override def toJsValue = Json.obj("label" -> label, "age" -> age, "company" -> company)
}
这有明显的缺点:
Person
现在子类必须了解JsValue
s;
这只能像的情况下进行Writes
,其中类型参数作为参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句