2013-07-18 3 views
10

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

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 и спрей-1.2.5

JSON
+0

См. [Этот пример] (https://github.com/spray/spray/blob/master/examples/spray-client/simple-spray-client/src/main/scala/spray/examples/Main.scala), который использует '' 'List'''. – opyate

ответ

2

Кроме того, необходимо импортировать формат, определенный на маршруте объем:

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

У меня есть импорт. Марширование объектов типа ElementResponse работает отлично. Что не работает, это сортировка списков этих объектов. –

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 
    } 
} 
+0

Это хорошая идея, но как мне использовать маршаллер в моем json-протоколе? (JollyJsonProtocol в моем случае) - добавление этого неявного метода в класс протокола не помогает. –

+1

Я бы порекомендовал вам переименовать ваш JollyJsonProtocol и сделать его как сопутствующий объект для [налога на импорт] [2]. Список marshaller должен работать, импортируя его в область действия. Что касается 'Stream', просто вызывайте' toStream' в свой список – 4lex1v

5

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

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

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

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