2016-12-28 6 views
0

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

trait Thing { 
    val name: String 
    val created: DateTime = DateTime.now 
} 

case class Door(override val name: String) extends Thing 

Это Акка-клиент, и я пытаюсь вернуться JSON на запрос получит:

... 
~ 
    path ("get"/Segment) { id => 
     get { 

     onComplete(doorsManager ? ThingsManager.Get(id)) { 
      case Success(d: Door) => { 
      complete(200, d) 
      } 
      case Success(_) => { 
      complete(404, s"door $id not found") 
      } 
      case Failure(reason) => complete(500, reason) 
     } 
     } 
    } ~ 
... 

, но я получаю только имя JSON. У меня есть неявные седаризаторы Joda в области. Если я переопределяю «созданную» метку времени в конструкторе класса case, она становится сериализованной, но она определяет цель, так как мне не нужен (или нужен) пользователь для предоставления метки времени. Я попытался переместить временную метку в дверь (либо переопределить, либо просто пропустить признак), и результат будет таким же (то есть «не создан»).

Как сообщить JSON4S о сериализации внутренних элементов (и унаследованных) тоже?

ответ

2

Вы должны определить нестандартный формат.

import org.json4s.{FieldSerializer, DefaultFormats} 
import org.json4s.native.Serialization.write 

case class Door(override val name: String) extends Thing 
trait Thing { 
    val name: String 
    val created: DateTime = DateTime.now 
} 

implicit val formats = DefaultFormats + FieldSerializer[Door with Thing()] 

val obj = new Door("dooor") 
write(obj) 
+0

Во-первых, спасибо, что ответили. Я предполагаю, что FieldSerializer [Door with Thing()] (не компилировался) был опечаткой для FieldSerializer [Door with Thing]() (который компилировался) Я применил ваше предложение как в самой двери, так и в сопутствующем объекте Door и в классе API. но дата не вернулась. –

+0

Хорошо. это сработало. У меня был еще один скрытый внутри Thing, который был похож (не включая Дверь). После его удаления и размещения неявных форматов в сопутствующем объекте Door (и добавлении ++ JodaTimeSerializers.all), похоже, он также содержит метку времени –