2013-07-18 13 views
10

Używam spray-json do przekazywania list niestandardowych obiektów do JSON. Mam następującą klasę przypadków i jej JsonProtocol.spray-json i lista zestawień

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) 
} 

Kiedy próbuję wprowadzić w trasie jak ten:

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

pojawia się błąd mówiący, że:

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

Być może wiesz, co jest problemem?

Używam Scala 2.10.1 spray 1,1-M7 i spray-json 1.2.5

+0

Zobacz [ten przykład] (https://github.com/spray/spray/blob/master/examples/spray-client/simple-spray-client/src/main/scala/spray/examples/Main.scala), który używa "Listy". – opyate

Odpowiedz

2

Należy również importować format, którego zdefiniowanego zakresu Trasa:

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

Mam ten import. Obiekty Marshalling typu ElementResponse działają dobrze. To, co nie działa, to porządkowanie list tych obiektów. –

3

The Najprostszym sposobem, aby to zrobić, to zrobić String z listy lub będziesz mieć do czynienia z 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(",") 
     } 
    } 

sposób sekund jest konwersja listy do Stream[ElementResponse] i niech sprayu chunck to dla ciebie.

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

To fajny pomysł, ale w jaki sposób powinienem użyć programu Marshall w moim protokole json? (JollyJsonProtocol w moim przypadku) - dodanie tej niejawnej metody do klasy protokołu nie pomaga. –

+1

Polecam zmienić nazwę swojej JollyJsonProtocol i zrobić ją jako obiekt towarzyszący [podatek importowy] [2]. Lista marshallerów powinna działać poprzez zaimportowanie jej do zakresu. Jeśli chodzi o 'Stream', po prostu wywołaj' toStream' na twojej liście – 4lex1v

5

To jest stary problem, ale mam ochotę dać moje 2c. Dzisiaj patrzyłem na podobne problemy.

Marcin, wygląda na to, że Twój problem nie został rozwiązany (o ile mogę przeczytać) - dlaczego zaakceptowałeś jedną odpowiedź?

Czy dodałeś import spray.json.DefaultJsonProtocol._ w miejscach? Odpowiadają za pracę z takimi obiektami, jak Seq, Map, Option i Tuple. Zakładam, że to może być przyczyną twojego problemu, ponieważ jest to List, który nie ulega konwersji.