Сериализация Nones с помощью json4s в классе case

Я не могу понять это. Скажем, у меня есть класс 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 для любого из этих членов.

Спасибо


person awfulHack    schedule 28.08.2014    source источник


Ответы (1)


понятно:

case n: Note => ("id" -> n.id) ~ ("noteA" -> n.noteA.getOrElse(null)) ~ ("noteB" -> n.noteB.getOrElse(null)) }))

терпение — добродетель, но не моя.

person awfulHack    schedule 28.08.2014