scala spray.json如何获取Json对象

时间:2017-12-12 04:15:06

标签: json scala spray

如果我尝试Http Get Response {"ReturnValue":""}, 此代码出错。

  

引起:spray.json.DeserializationException:Expected List as   JsArray,但得到{“ReturnValue”:“”}

import spray.httpx.SprayJsonSupport._
import spray.json.DefaultJsonProtocol
import spray.http._
import spray.client.pipelining._
import scala.concurrent.duration._
import scala.concurrent.{ Await, Future }
import akka.actor.ActorSystem
import scala.concurrent.ExecutionContext.Implicits.global

class ApiHelper extends DefaultJsonProtocol {
  case class Robot(name: String, color: Option[String], amountOfArms: Int)

  implicit val RobotFormat = jsonFormat3(Robot)
  def CallAPI(httpMethod: String, subURL: String): String = {
    val apiLocation = "~~~"
    val timeout = 5.seconds

    implicit val system = ActorSystem("robotClient")
    return httpMethod match {
      case "GET" =>
        val pipeline: HttpRequest => Future[List[Robot]] = sendReceive ~> unmarshal[List[Robot]]
        val f: Future[List[Robot]] = pipeline(Get(s"$apiLocation"+subURL))
        val robots = Await.result(f, timeout)
        println(s"Got the list of robots: $robots")
        return "hello"
    }
  }
}
  

引起:spray.json.DeserializationException:预期列表为JsArray,但在

获得{“ReturnValue”:“”}      

spray.json.package $ .deserializationError(package.scala:23)at   spray.json.CollectionFormats $$匿名$ 1.read(CollectionFormats.scala:29)     在   spray.json.CollectionFormats $$匿名$ 1.read(CollectionFormats.scala:25)     在   spray.httpx.SprayJsonSupport $$ anonfun $ sprayJsonUnmarshaller $ 1.applyOrElse(SprayJsonSupport.scala:37)     在   spray.httpx.SprayJsonSupport $$ anonfun $ sprayJsonUnmarshaller $ 1.applyOrElse(SprayJsonSupport.scala:34)     在   scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)     在   spray.httpx.unmarshalling.Unmarshaller $$不久$ 1 $$ anonfun $解组$ 1.适用(Unmarshaller.scala:29)     在   spray.httpx.unmarshalling.SimpleUnmarshaller.protect(SimpleUnmarshaller.scala:40)     在   spray.httpx.unmarshalling.Unmarshaller $$匿名$ 1.unmarshal(Unmarshaller.scala:29)     在   spray.httpx.unmarshalling.SimpleUnmarshaller.apply(SimpleUnmarshaller.scala:29)     在   spray.httpx.unmarshalling.SimpleUnmarshaller.apply(SimpleUnmarshaller.scala:23)     在   spray.httpx.unmarshalling.UnmarshallerLifting $$匿名$ 3.apply(UnmarshallerLifting.scala:35)     在   spray.httpx.unmarshalling.UnmarshallerLifting $$匿名$ 3.apply(UnmarshallerLifting.scala:34)     在   spray.httpx.unmarshalling.UnmarshallerLifting $$匿名$ 2.适用(UnmarshallerLifting.scala:30)     在   spray.httpx.unmarshalling.UnmarshallerLifting $$匿名$ 2.适用(UnmarshallerLifting.scala:29)     在   spray.httpx.unmarshalling.package $ PimpedHttpResponse.as(package.scala:51)     在   spray.httpx.ResponseTransformation $$ anonfun $解组$ 1.适用(ResponseTransformation.scala:33)     ......还有13个

有没有办法获得Json对象?

1 个答案:

答案 0 :(得分:0)

您可以提供并使用自己的unmarshal实现,它将构造JsValue而不是List [Robot]。 JsValue将表示有效响应(机器人列表)或任意json响应(或可能更多自定义对象类型)。

  def unmarshal: HttpResponse ⇒ JsValue =
    response ⇒
      if (response.status.isSuccess)
        response.as[List[Robot]] match {
          case Right(value) ⇒ value.toJson
          case Left(error: MalformedContent) ⇒
            response.as[JsObject] match {
              case Right(value) ⇒ value.toJson
              case Left(error)  => throw new PipelineException(error.toString)
            }

      case Left(error) ⇒ throw new PipelineException(error.toString)
    }
  else throw new UnsuccessfulResponseException(response.status)

在将来(调用管道)返回JsValue之后,您可以尝试以受控方式(例如在Try块中)将其再次转换回List [Robot],并且在失败的情况下将其作为自定义json响应处理。