我无法解决这个问题,比如说我有一个包含选项的案例类,如:
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。
谢谢
答案 0 :(得分:0)
得到了它:
case n: Note => ("id" -> n.id) ~ ("noteA" -> n.noteA.getOrElse(null)) ~ ("noteB" -> n.noteB.getOrElse(null)) }))
耐心是一种美德,而不是我的一种。