Как я могу преобразовать входящие пустые необязательные поля массива в None с помощью spray-json? - PullRequest
0 голосов
/ 25 марта 2019

Сайт, с которым я работаю, возвращает пустые массивы для необязательных полей, которые не имеют значений.

т.е. с учетом этих определений -

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.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Я никогда не использовал этот плагин, но основываясь на том, что я прочитал. Я думаю, что вы хотите что-то вроде этого.


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 голосов
/ 25 марта 2019

Я принял ответ, опубликованный Рексом, так как он работает, и именно там я и оказался первым, но я думаю, что вы также можете сделать это -

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, но, похоже, это не работает.

...