在案例类中使用json4s序列化Nones

时间:2014-08-28 20:52:28

标签: scala scalatra json4s

我无法解决这个问题,比如说我有一个包含选项的案例类,如:

  case class Note(id: Int, noteA: Option[String], noteB: Option[String])

如果我尝试使用scalaltra指南禁止的json4s将其序列化为json,我的case类中的任何Nones都会从输出中删除。如下代码

  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

我想知道如何匹配noteA和noteB字段中的Some / None,并且对于其中任何一个成员,如果为None,则返回JNull。

谢谢

1 个答案:

答案 0 :(得分:0)

得到了它:

case n: Note => ("id" -> n.id) ~ ("noteA" -> n.noteA.getOrElse(null)) ~ ("noteB" -> n.noteB.getOrElse(null)) }))
耐心是一种美德,而不是我的一种。