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
переменная.