Я не могу понять это. Скажем, у меня есть класс case с такими параметрами, как:
case class Note(id: Int, noteA: Option[String], noteB: Option[String])
Если я попытаюсь сериализовать его в json, используя json4s, как это запрещено руководствами Scalaltra, любые None в моем классе case будут удалены из вывода. Такой, что следующий код
protected implicit val jsonFormats: Formats = DefaultFormats
before() {
contentType = formats("json")
}
get("/MapWNone") {
new Note(1, None, None)
}
выведет вывод "{"id":1}", я хотел бы получить вывод, например: {"id":1, "noteA": null, "noteB": null}
Я написал CustomSerializer по строкам:
class NoteSerializer extends CustomSerializer[Note](format => ({
| case jv: JValue =>
| val id = (jv \ "id").extract[Int]
| val noteA = (jv \ "noteA").extract[Option[String]]
| val noteB = (jv \ "noteB").extract[Option[String]]
| Note(id, noteA, noteB)
| }, { case n: Note => ("id" -> n.id) ~ ("noteA" -> n.noteA) ~ ("noteB" -> n.noteB) }))
Что делает то же самое, что и форматтер по умолчанию.
Я думаю, что изменение последней строки на это сработает
case n: Note => ("id" -> n.id) ~ ("noteA" -> n.noteA.getOrElse(JNull)) ~ ("noteB" -> n.noteB.getOrElse(JNull))
но не компилируется.
No implicit view available from java.io.Serializable => org.json4s.JsonAST.JValue
Мне интересно, как я могу сопоставить Some/None в полях noteA и noteB и вернуть JNull в случае None для любого из этих членов.
Спасибо