斯卡拉Scala如何使用json Spray取消对选项值的编组?

问题描述

我正在使用json-spray库解组json数组。 这是代码

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import spray.json.DefaultJsonProtocol._

 def unmarshalProfiles(response: HttpResponse): Future[Array[Profile]] = {
        implicit val profileFormat = jsonFormat16(Profile)
        println("[RES - SUCCESS] Request returned with " + response.status)
        return  Unmarshal(response.entity).to[Array[Profile]]
      }

远程服务器将其响应写为json数组。如果响应中填满一个或多个项目,则没有问题。但是,如果没有可用的配置文件项,则服务器返回 null (不是空数组),并且在解组时出现错误 'Expected Array as JsArray,但为空'

我认为一个不错的选择是将Array [Profile]包装到Option对象中。 所以我将代码更改为以下代码

 def unmarshalProfiles(response: HttpResponse): Future[Option[Array[Profile]]] = {
        implicit val profileFormat = jsonFormat16(Profile)
        println("[RES - SUCCESS] Request returned with " + response.status)
        return  Unmarshal(response.entity).to[Option[Array[Profile]]]
      }

仍然,当响应为空对象时,我将获得相同的错误。 在 时,是否存在一种解组Option对象的方法? 预先感谢!

解决方法

您可以选择与所有选项一起使用。也就是说,要像这样定义您的方法:

def unmarshalProfiles(response: HttpResponse)(implicit mat: Materializer): Future[Option[Array[Profile]]] = {
  implicit val profileFormat = jsonFormat16(Profile)
  Unmarshal(Option(response.entity)).to[Option[Array[Profile]]]
}

然后将null编组到None中,现有数组将变成Some(...)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...