У меня есть один класс, который расширяет черту, как показано ниже:
case class Phone(number: String)
trait Person {
def name: String
def phones: Seq[Phone]
}
case class Employee(name: String, phones: Seq[Phone] = Seq.empty) extends Person
Как показано выше, класс Employee расширяет черту Person.
Я пытаюсь сериализовать, а затем десериализовать один объект типа Employee, как показано ниже:
implicit val formats = DefaultFormats
val emp: Person = Employee("foo")
val c = write(emp)
val e2 = parse(c).extract[Person]
Объект emp правильно сериализуется
emp: Person = Employee(foo,List())
c: String = {"name":"foo","phones":[]}
но метод parse(c).extract[Person] не работает со следующим исключением:
org.json4s.package$MappingException: No constructor for type Person,
JObject(List((name,JString(foo)), (phones,JArray(List()))))
Я попытался добавить FieldSerializer, как показано ниже, но получил такое же исключение.
implicit val formats = DefaultFormats + FieldSerializer[Employee with Person]()
Итак, я начал писать собственный сериализатор, который выглядит следующим образом:
case object PersonSerializer extends CustomSerializer[Person](formats => (
{
case JObject(
List(
JField("name", JString(name)),
JField("phones", JArray(List(phones)) )
)
) => Employee(name, phones)
},
{
case Employee(name, phones) => JObject(JField("name", JString(name)))
}
))
но этот сериализатор не скомпилируется со следующей ошибкой:
type mismatch;
found : org.json4s.JsonAST.JValue
required: Seq[Phone]
) => Employee(name, phones)
Итак, не могли бы вы помочь мне написать собственный сериализатор или преобразовать JValue в Seq[Phone]?

Я не думаю, что ваша реальная проблема — это не та, о которой вы думаете, — вы не можете извлечь Личность, это черта! Вместо этого я бы извлек сотрудника; если вам нужно, чтобы это был человек, просто приведите его к человеку после извлечения.