我的请求中有一个可选字段:
case class SearchRequest(url: String, nextAt: Option[Date])
Run Code Online (Sandbox Code Playgroud)
我的协议是:
object SearchRequestJsonProtocol extends DefaultJsonProtocol {
implicit val searchRequestFormat = jsonFormat(SearchRequest, "url", "nextAt")
}
Run Code Online (Sandbox Code Playgroud)
如何将nextAt字段标记为可选,以便正确读取和接受以下JSON对象:
{"url":"..."}
{"url":"...", "nextAt":null}
{"url":"...", "nextAt":"2012-05-30T15:23Z"}
Run Code Online (Sandbox Code Playgroud)
我实际上并不关心null的情况,但如果你有细节,那就太好了.我正在使用spray-json,并且认为如果原始JSON对象上没有该选项,则使用Option会跳过该字段.
elb*_*ich 26
适合我(喷-json 1.1.1 scala 2.9.1 build)
import cc.spray.json._
import cc.spray.json.DefaultJsonProtocol._
// string instead of date for simplicity
case class SearchRequest(url: String, nextAt: Option[String])
// btw, you could use jsonFormat2 method here
implicit val searchRequestFormat = jsonFormat(SearchRequest, "url", "nextAt")
assert {
List(
"""{"url":"..."}""",
"""{"url":"...", "nextAt":null}""",
"""{"url":"...", "nextAt":"2012-05-30T15:23Z"}""")
.map(_.asJson.convertTo[SearchRequest]) == List(
SearchRequest("...", None),
SearchRequest("...", None),
SearchRequest("...", Some("2012-05-30T15:23Z")))
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*ble 11
您可能必须创建显式格式(警告:psuedocodish):
object SearchRequestJsonProtocol extends DefaultJsonProtocol {
implicit object SearchRequestJsonFormat extends JsonFormat[SearchRequest] {
def read(value: JsValue) = value match {
case JsObject(List(
JsField("url", JsString(url)),
JsField("nextAt", JsString(nextAt)))) =>
SearchRequest(url, Some(new Instant(nextAt)))
case JsObject(List(JsField("url", JsString(url)))) =>
SearchRequest(url, None)
case _ =>
throw new DeserializationException("SearchRequest expected")
}
def write(obj: SearchRequest) = obj.nextAt match {
case Some(nextAt) =>
JsObject(JsField("url", JsString(obj.url)),
JsField("nextAt", JsString(nextAt.toString)))
case None => JsObject(JsField("url", JsString(obj.url)))
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用NullOptions
trait禁用跳过null
s:https:
//github.com/spray/spray-json#nulloptions
示例:https:
//github.com/spray/spray-json/blob/master/src/test/scala/spray/ JSON/ProductFormatsSpec.scala
归档时间: |
|
查看次数: |
14366 次 |
最近记录: |