Scala конвертировать объект в ответ JSON - PullRequest
0 голосов
/ 20 мая 2019

Как преобразовать следующий объект класса case в ответ JSON, класс case содержит несколько значений вложенного объекта.

Я получаю исключение при использовании jsonFormat5(responseData)

val simpleBanner1 = Banner(112, "http://dummyimage.com/300x250", 300, 250)
val responseData = BidResponse(uuid, "XN2zZQABxJsKK0jU4QnIzw", campaignData.bid, Option("4548"), Option(simpleBanner1))

Исключение

Error:(63, 47) could not find implicit value for evidence parameter of type bidder.RestService.JF[Option[bidder.Banner]]
implicit val bidResponseFormat = jsonFormat5(BidResponse)

Error:(63, 47) not enough arguments for method jsonFormat5: (implicit evidence$25: bidder.RestService.JF[String], implicit evidence$26: bidder.RestService.JF[String], implicit evidence$27: bidder.RestService.JF[Double], implicit evidence$28: bidder.RestService.JF[Option[String]], implicit evidence$29: bidder.RestService.JF[Option[bidder.Banner]], implicit evidence$30: scala.reflect.ClassTag[bidder.BidResponse])spray.json.RootJsonFormat[bidder.BidResponse].
Unspecified value parameters evidence$29, evidence$30.
implicit val bidResponseFormat = jsonFormat5(BidResponse)

Error:(76, 28) Cannot find JsonWriter or JsonFormat type class for bidder.BidResponse
          responseData.toJson
Error:(76, 28) not enough arguments for method toJson: (implicit writer: spray.json.JsonWriter[bidder.BidResponse])spray.json.JsValue.
Unspecified value parameter writer.
          responseData.toJson

1 Ответ

1 голос
/ 20 мая 2019

jsonFormat5 следует использовать с классом case, так как он определяет, как объект должен быть закодирован. Ваш код должен выглядеть так:

import spray.json._
import DefaultJsonProtocol._

// define format implicitly for BidResponse and Banner case classes
implicit val bannerFormat = jsonFormat4(Banner)
implicit val bidResponseFormat = jsonFormat5(BidResponse)

// serialize BidResponse object
val bidResponseJson = responseData.toJson

Вот расширенный пример:

import spray.json._
import DefaultJsonProtocol._

// example case classes
case class Banner(num: Int, url: String, num2: Int, num3: Int)
case class BidResponse(uuid: String, code: String, num: Int, opt: Option[String], banner: Option[Banner])

implicit val bformat = jsonFormat4(Banner)
implicit val format = jsonFormat5(BidResponse)

val simpleBanner1 = Banner(112, "http://dummyimage.com/300x250", 300, 250)
val responseData = BidResponse("abcdef", "XN2zZQABxJsKK0jU4QnIzw", 1234, Option("4548"), Option(simpleBanner1))

println( responseData.toJson )

Как уже упоминалось в комментариях, формат баннера должен быть определен неявно, поскольку от него зависит объект BidResponse. ref: bformat переменная.

...