如何使用 spray-json 将入站空可选数组字段转换为 None?
How can I convert inbound empty optional array fields to None with spray-json?
我正在使用的网站 return 没有值的可选字段的空数组。
即给出这些定义 -
case class Sample(f1: Option[Seq[F1]], id: Option[Int])
implicit val formatF1 = jsonFormat4(F1)
implicit val formatSample = jsonFormat2(Sample)
我明白了 -
Sample(Some(List()),Some(123))
而不是-
Sample(None,Some(123))
如果入站为空,有没有简单的方法return None?我只对阅读感兴趣,我不会写 json.
我从未使用过这个插件,但根据我所阅读的内容。我想你想要这样的东西。
import spray.json._
import spray.json.DefaultJsonProtocol._
// Example Class for F1.
case class F1(value: String) extends AnyVal
case class Sample(f1: Option[Seq[F1]], id: Option[Int])
implicit val formatF1 = jsonFormat4(F1)
implicit object SampleFormat extends JsonFormat[Sample] {
// Custom Reads validation.
def read(json: JsValue): Record = json match {
case JsObject(v) =>
try {
Sample({
val F1_JSON = v("f1").convertTo[Seq[F1]]
if (F1_JSON.isEmpty) None else Some(F1_JSON)
},
v("id").convertTo[Option[Int]])
} catch {
case _ => deserializationError("Cannot De-serialize to Sample object.")
}
case _ => deserializationError("Not a Sample Object.")
}
}
我已经接受了 Rex 发布的答案,因为它确实有效,这是我最先结束的地方,但我认为你也可以这样做 -
implicit def optionalSeqFmt[T: JsonFormat] = new RootJsonFormat[Option[Seq[T]]] {
def read(v: JsValue): Option[Seq[T]] = v match {
case JsArray(es) if es nonEmpty => Some(es map { _.convertTo[T] })
case _ => None
}
def write(list: Option[Seq[T]]) = ???
}
在我的例子中,我不需要写入部分,所以 JsonReader 而不是 JsonFormat,但这似乎不起作用。
我正在使用的网站 return 没有值的可选字段的空数组。
即给出这些定义 -
case class Sample(f1: Option[Seq[F1]], id: Option[Int])
implicit val formatF1 = jsonFormat4(F1)
implicit val formatSample = jsonFormat2(Sample)
我明白了 -
Sample(Some(List()),Some(123))
而不是-
Sample(None,Some(123))
如果入站为空,有没有简单的方法return None?我只对阅读感兴趣,我不会写 json.
我从未使用过这个插件,但根据我所阅读的内容。我想你想要这样的东西。
import spray.json._
import spray.json.DefaultJsonProtocol._
// Example Class for F1.
case class F1(value: String) extends AnyVal
case class Sample(f1: Option[Seq[F1]], id: Option[Int])
implicit val formatF1 = jsonFormat4(F1)
implicit object SampleFormat extends JsonFormat[Sample] {
// Custom Reads validation.
def read(json: JsValue): Record = json match {
case JsObject(v) =>
try {
Sample({
val F1_JSON = v("f1").convertTo[Seq[F1]]
if (F1_JSON.isEmpty) None else Some(F1_JSON)
},
v("id").convertTo[Option[Int]])
} catch {
case _ => deserializationError("Cannot De-serialize to Sample object.")
}
case _ => deserializationError("Not a Sample Object.")
}
}
我已经接受了 Rex 发布的答案,因为它确实有效,这是我最先结束的地方,但我认为你也可以这样做 -
implicit def optionalSeqFmt[T: JsonFormat] = new RootJsonFormat[Option[Seq[T]]] {
def read(v: JsValue): Option[Seq[T]] = v match {
case JsArray(es) if es nonEmpty => Some(es map { _.convertTo[T] })
case _ => None
}
def write(list: Option[Seq[T]]) = ???
}
在我的例子中,我不需要写入部分,所以 JsonReader 而不是 JsonFormat,但这似乎不起作用。