0

私はこれに数時間苦労しています。問題がどこにあるかを理解するのに誰かが私を助けてくれることを願っています。

Spray-JSON のテストケースはこちら

https://github.com/spray/spray-json/blob/master/src/test/scala/spray/json/AdditionalFormatsSpec.scala

case class Container[A](inner: Option[A])

object ReaderProtocol extends DefaultJsonProtocol {
  implicit def containerReader[T :JsonFormat] = 
    new JsonReader[Container[T]] {
      def read(value: JsValue) = value match {
        case JsObject(fields) if fields.contains("content") => 
          Container(Some(jsonReader[T].read(fields("content"))))
        case _ => deserializationError("Unexpected format: " + value.toString)
      }
    }
  }
}

これは、コンテナ タイプをシリアル化する方法を示しています。これを自分の状況に適応させようとしました。

case class ListResponseObject[A](url : String, data : Seq[A])

object ListResponseWriterProtocol extends DefaultJsonProtocol {
  implicit def containerWriter[T: JsonFormat] = lift {
    new JsonWriter[ListResponseObject[T]] {
      def write(obj: ListResponseObject[T]) = JsObject(
        "object" -> JsString("object"),
        "url" -> JsString(obj.url),
        "count" -> JsNumber(obj.data.length),
        "data" -> obj.data.toJson
      )
    }
  }
}

残念ながら、ここでこれを使用しようとすると

{ ctx : RequestContext =>
        ask(cardTokenActor, ListMessage(account))
            .mapTo[ListResponse]
            .onComplete {
              case Success(ListResponse(list: ListResponseObject[CardToken])) => 
                 ctx.complete(list)
              case Success(_) => ctx.complete(NotFound)
              case Failure(e: Throwable ) => logAndFail(ctx, e)
          }
 }

このエラーが発生します

161: could not find implicit value for evidence parameter of type 
spray.httpx.marshalling.Marshaller[com.smoothpay.services.ListResponseObject
[com.smoothpay.services.cardtoken.entity.CardToken]]
[error] case Success(ListResponse(list: ListResponseObject[CardToken])) =>    
ctx.complete(list)

また、すべての適切なインポートも用意しています。

import spray.httpx.SprayJsonSupport._
import spray.httpx.marshalling._
import spray.http._
import spray.json._

問題がどこにあるのか興味があります。事前に助けに感謝します。

4

1 に答える 1

3

あなたはそれを少し簡単にすることができます、私はそれが役立つと思います:

case class ListResponseObject[A](url : String, data : Seq[A])
object ListResponseWriterProtocol extends DefaultJsonProtocol {
  implicit def containerWriter[A: JsonFormat] = jsonFormat2(ListResponseObject.apply[A])
}
于 2013-09-08T21:00:20.787 に答える