Спрей-джсон и сортировка списка

Я использую spray-json для сортировки списков пользовательских объектов в JSON. У меня есть следующий класс case и его JsonProtocol.

case class ElementResponse(name: String, symbol: String, code: String, pkwiu: String, remarks: String, priceNetto: BigDecimal, priceBrutto: BigDecimal, vat: Int, minInStock:Int,                        maxInStock: Int)

object JollyJsonProtocol extends DefaultJsonProtocol with SprayJsonSupport  {
 implicit val elementFormat = jsonFormat10(ElementResponse)
}

Когда я пытаюсь вставить такой маршрут, как этот:

get {
      complete {
        List(new ElementResponse(...), new ElementResponse(...))
      }
    }

Я получаю сообщение об ошибке:

 could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[List[pl.ftang.scala.polka.rest.ElementResponse]]

Возможно, вы знаете, в чем проблема?

Я использую Scala 2.10.1 с распылителем 1.1-M7 и спрей-json 1.2.5

Ответ 1

Вам также необходимо импортировать формат, который вы определили в области маршрута:

import JollyJsonProtocol._
get {
      complete {
        List(new ElementResponse(...), new ElementResponse(...))
      }
    }

Ответ 2

Это старая проблема, но я чувствую, что отдаю свой 2c. Сегодня смотрел похожие проблемы.

Марцин, кажется, что ваша проблема не была фактически решена (насколько я могу прочитать) - почему вы приняли один ответ?

Вы пытались добавить import spray.json.DefaultJsonProtocol._ в места? Они отвечают за работу, например, Seq s, Map s, Option и Tuple. Я предполагаю, что это может быть причиной вашей проблемы, так как это List, которое не преобразуется.

Ответ 3

Самый простой способ сделать это - сделать строку из вашего списка или вам придется иметь дело с ChunckedMessages:

implicit def ListMarshaller[T](implicit m: Marshaller[T]) =
    Marshaller[List[T]]{ (value, ctx) =>
      value match {
        case Nil => ctx.marshalTo(EmptyEntity)
        case v => v.map(m(_, ctx)).mkString(",")
      }
    }

В секундах можно преобразовать ваш список в Stream[ElementResponse] и позволить спрей chunck для вас.

get {
  complete {
    List(new ElementResponse(...), new ElementResponse(...)).toStream
  }
}