Spray-json反序列化对象的嵌套列表

时间:2018-10-03 09:44:57

标签: json scala spray

我有一个嵌套在另一个类列表中的类。看起来像这样

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方法时,我得到“找不到Course的JsonWriter或JsonFormat类型类”

我不确定如何实现对象的嵌套列表的反序列化,我在文档的任何地方都找不到。以前有人设法做到这一点吗?

最好。

1 个答案:

答案 0 :(得分:0)

所以我设法通过隐式重写write函数来完成它。

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 {
      ...
    }
  }
}