2013-09-08 2 views
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._ 

Мне любопытно, где проблема. Оцените помощь заранее.

ответ

3

Вы можете сделать это немного проще, я думаю, что должно помочь:

case class ListResponseObject[A](url : String, data : Seq[A]) 
object ListResponseWriterProtocol extends DefaultJsonProtocol { 
    implicit def containerWriter[A: JsonFormat] = jsonFormat2(ListResponseObject.apply[A]) 
} 
+0

прекрасно работает! Благодаря!! –

Смежные вопросы