如何使用spray-json将入站空可选数组字段转换为None?

问题描述 投票:-2回答:2

我正在使用的网站返回没有值的可选字段的空数组。

即鉴于这些定义 -

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))

如果入站为空,是否有一种简单的方法可以返回None?我只对阅读方感兴趣,我不会写json。

scala optional spray-json
2个回答
1
投票

我从来没有使用过这个插件,而是基于我读过的内容。我想你想要这样的东西。


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.")
  }
}

0
投票

我已经接受了雷克斯发布的答案,因为它确实有效,这是我最先结束的地方,但我想你也可以这样做 -

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,但似乎不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.