спрей-json и сортировка списка

Я использую 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.


person Marcin Cylke    schedule 18.07.2013    source источник
comment
См. этот пример, в котором используется List.   -  person opyate    schedule 18.09.2014


Ответы (3)


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

import JollyJsonProtocol._
get {
      complete {
        List(new ElementResponse(...), new ElementResponse(...))
      }
    }
person Johnny Everson    schedule 19.07.2013
comment
У меня есть такой импорт. Маршаллинг объектов типа ElementResponse работает нормально. Что не работает, так это сортировка списков этих объектов. - person Marcin Cylke; 19.07.2013

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

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

Вы пробовали добавлять import spray.json.DefaultJsonProtocol._ местами? Они отвечают за то, чтобы такие вещи, как Seqs, Maps, Options и Tuples, работали. Я предполагаю, что это может быть причиной вашей проблемы, поскольку List не преобразуется.

person akauppi    schedule 30.06.2015

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

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] и позволить распылить разделить его для вас.

get {
  complete {
    List(new ElementResponse(...), new ElementResponse(...)).toStream
  }
}
person 4lex1v    schedule 19.07.2013
comment
Это хорошая идея, но как мне использовать marshaller в моем протоколе json? (JollyJsonProtocol в моем случае) — добавление этого неявного метода в класс протокола не помогает. - person Marcin Cylke; 20.07.2013
comment
Я бы порекомендовал вам переименовать ваш JollyJsonProtocol и сделать его сопутствующим объектом для [налога на импорт][2]. Маршаллер списка должен работать, импортируя его в область видимости. Что касается Stream, просто позвоните toStream в свой список. - person 4lex1v; 20.07.2013