Я использую свою собственную неявную реализацию сериализатора и десериализатора JSON для моего объекта case.
Мой класс case выглядит так (это всего лишь фрагмент кода)
sealed trait MyTrait
case object MyCaseClass extends MyTrait
Я хочу написать свой собственный сер. и достоин. JSON для MyTrait
implicit val myTraitFormat = new JsonFormat[MyTrait] {
override def read(json: JsValue): MyTrait = json.asJsObject.getFields("value") match {
case Seq(JsString("TEST")) ⇒ MyCaseClass
case _ ⇒ throw new DeserializationException(s"$json is not a valid extension of my trait")
}
override def write(myTrait: MyTrait): JsValue = {
myTrait match {
case MyCaseClass => JsObject("value" -> JsString("TEST"))
}
}
}
Теперь мой тест терпит неудачу, вызывая исключение DeserializationException:
"The my JSON format" when {
"deserializing a JSON" must {
"return correct object" in {
val json = """{"value": "TEST"}""".asJson
json.convertTo[MyTrait] must equal (MyCaseClass)
}
}
}
Очевидно, что json.asJsObject.getFields("value")
не может быть сопоставлено с Seq(JsString("TEST"))
. Может быть, это связано с использованием трейтов? Но я нашел пример на официальном сайте spray-json https://github.com/spray/spray-json#providing-jsonformats-for-other-types
Любые идеи, как правильно сопоставить поле в JsObject?
Спасибо! Лучший