2013-07-18 12 views
10

Ich verwende spray-json, um Listen von benutzerdefinierten Objekten in JSON zu marshallen. Ich habe die folgende Fallklasse und ihr JsonProtocol.spray-json und Liste Marshalling

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

Wenn ich versuche, wie diese in einer Route setzen in:

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

Ich erhalte eine Fehlermeldung, dass zu sagen:

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

Vielleicht wissen Sie, was das Problem ist?

Ich verwende Scala 2.10.1 mit Spray 1.1-M7 und Spray-json 1.2.5

+0

Siehe [dieses Beispiel] (https://github.com/spray/spray/blob/master/examples/spray-client/simple-spray-client/src/main/scala/spray/examples/Main.scala), die eine '' 'List''' verwendet. – opyate

Antwort

2

Sie müssen auch das Format Sie auf der Route Umfang definiert importieren:

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

Ich habe diesen Import. Das Marshallen von Objekten vom Typ "ElementResponse" funktioniert einwandfrei. Was nicht funktioniert, ist das Rangieren von Listen dieser Objekte. –

3

Die einfachste Weg, dies zu tun, ist ein String aus der Liste zu machen, oder Sie werden mit ChunckedMessages zu tun haben:

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(",") 
     } 
    } 

die Sekunden Weg, um Ihre Liste in die Stream[ElementResponse] konvertieren und lassen Spray chunck es für Sie.

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

Das ist eine nette Idee, aber wie sollte ich Marshaller in meinem Json-Protokoll verwenden? (JollyJsonProtocol in meinem Fall) - das Hinzufügen dieser impliziten Methode zur Protokollklasse hilft nicht. –

+1

Ich würde Ihnen empfehlen, Ihr JollyJsonProtocol umzubenennen und es als Begleitobjekt für [Import tax] [2] zu machen. Der Marshaller sollte funktionieren, indem er in den Bereich importiert wird. Rufen Sie für 'Stream' einfach' toStream' auf Ihrer Liste auf – 4lex1v

5

Dies ist ein altes Thema, aber ich fühle mich wie meinen 2c geben. Guckte heute ähnliche Themen an.

Marcin, es scheint, dass Ihr Problem nicht wirklich gelöst wurde (soweit ich lesen kann) - warum haben Sie eine Antwort akzeptiert?

Haben Sie versucht, import spray.json.DefaultJsonProtocol._ an Orten hinzuzufügen? Diese sind verantwortlich für Dinge wie Seq s, Map s, Option s und Tuple s zu arbeiten. Ich nehme an, dies könnte die Ursache für Ihr Problem sein, da es die List ist, die nicht konvertiert wird.

Verwandte Themen