【问题标题】:scala spray.json how to get Json Objectscala spray.json 如何获取 Json 对象
【发布时间】:2018-05-25 16:53:39
【问题描述】:

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

原因:spray.json.DeserializationException:预期列表为 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) 在 spray.json.CollectionFormats$$anon$1.read(CollectionFormats.scala:29) 在 spray.json.CollectionFormats$$anon$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$$anon$1$$anonfun$unmarshal$1.apply(Unmarshaller.scala:29) 在 spray.httpx.unmarshalling.SimpleUnmarshaller.protect(SimpleUnmarshaller.scala:40) 在 spray.httpx.unmarshalling.Unmarshaller$$anon$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$$anon$3.apply(UnmarshallerLifting.scala:35) 在 spray.httpx.unmarshalling.UnmarshallerLifting$$anon$3.apply(UnmarshallerLifting.scala:34) 在 spray.httpx.unmarshalling.UnmarshallerLifting$$anon$2.apply(UnmarshallerLifting.scala:30) 在 spray.httpx.unmarshalling.UnmarshallerLifting$$anon$2.apply(UnmarshallerLifting.scala:29) 在 spray.httpx.unmarshalling.package$PimpedHttpResponse.as(package.scala:51) 在 spray.httpx.ResponseTransformation$$anonfun$unmarshal$1.apply(ResponseTransformation.scala:33) ... 13 更多

有没有办法获取Json Object?

【问题讨论】:

    标签: json scala spray


    【解决方案1】:

    您可以提供和使用您自己的 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 响应处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多