Spray-JSON десериализация вложенного списка объектов - PullRequest
0 голосов
/ 03 октября 2018

У меня есть класс, который вложен в список в другом классе.это выглядит так

import spray.json._
import DefaultJsonProtocol._

case class Person(
                     firstName: String,
                     lastName: String
                    )

object Person {
 ...
}

object PersonJsonProtocol extends DefaultJsonProtocol {
  implicit val personFormat = jsonFormat2(Person.apply)
}

метод toJson здесь работает отлично, однако этот класс встроен в виде списка в другом классе, как этот.

import Person._
import PersonJsonProtocol._
import spray.json._
import DefaultJsonProtocol._

case class Course(
                     courseName: String,
                     students: List[Person]
                    )

object CourseJsonProtocol extends DefaultJsonProtocol {
  implicit val courseFormat = jsonFormat2(Course)
}

в другом классе

import Person._
import Course._
import PersonJsonProtocol._
import CourseJsonProtocol._

new Course("English", List(persons)).toJson
// this is failing

Однако, когда я импортирую этот протокол и пытаюсь использовать метод toJson, я получаю «Не удается найти класс типа JsonWriter или JsonFormat для курса»

Я не уверен, как добиться десериализации вложенного спискаобъекты, я не могу найти это где-нибудь в документах.Кто-то успел сделать это раньше?

Best.

1 Ответ

0 голосов
/ 03 октября 2018

Так что мне удалось это сделать, неявно переопределив функцию записи.

object CourseJsonProtocol extends DefaultJsonProtocol {
  implicit object CourseFormat extends RootJsonFormat[Course] {
    def write(course: Course) = {
      JsObject(
              "course_name" -> JsString(course.courseName),
              "students" -> JsArray(for(student <- course.students) yield student.toJson)
              )
    }
    def read(value: JsValue) = value match {
      ...
    }
  }
}
...