JSON4S не может десериализовать объект

У меня есть один класс, который расширяет черту, как показано ниже:

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]?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
821
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме