2013-07-18 14 views
10

Sto usando spray-json per elencare gli oggetti personalizzati in JSON. Ho la seguente classe di casi e il suo JsonProtocol.spray-json e list 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) 
} 

Quando provo a mettere in in un percorso come questo:

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

ottengo un errore dicendo che:

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

Forse sapete qual è il problema?

sto usando Scala 2.10.1 con spray 1.1-M7 e spray-JSON 1.2.5

+0

Vedere [questo esempio] (https://github.com/spray/spray/blob/master/examples/spray-client/simple-spray-client/src/main/scala/spray/examples/Main.scala), che usa un '' 'List'''. – opyate

risposta

2

È inoltre necessario importare il formato definito sulla portata percorso:

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

Ho quell'importazione. Il marshalling degli oggetti di tipo ElementResponse funziona correttamente. Ciò che non funziona è il marshalling Elenchi di quegli oggetti. –

3

Il modo più semplice per farlo, è quello di rendere una stringa dall'elenco o ti fare i conti con 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(",") 
     } 
    } 

il modo secondi è quello di convertire l'elenco nello Stream[ElementResponse] e far spruzzare 01.232.per te.

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

Questa è una buona idea, ma come dovrei usare marshaller nel mio protocollo json? (JollyJsonProtocol nel mio caso) - l'aggiunta di questo metodo implicito alla classe del protocollo non aiuta. –

+1

Ti consigliamo di rinominare JollyJsonProtocol e renderlo come oggetto companion per [tassa di importazione] [2]. Il marshaller di elenco dovrebbe funzionare importandolo nell'oscilloscopio. Per quanto riguarda 'Stream' basta chiamare 'toStream' nella tua lista – 4lex1v

5

Questo è un vecchio problema, ma mi sento come dare il mio 2c. Stavo guardando questioni simili oggi.

Marcin, sembra che il problema non sia stato effettivamente risolto (per quanto posso leggere) - perché hai accettato una risposta?

Hai provato ad aggiungere import spray.json.DefaultJsonProtocol._ in luoghi? Questi sono incaricati di eseguire operazioni come Seq s, Map s, Option s e Tuple s. Suppongo che questo potrebbe essere la causa del tuo problema, dal momento che è il List che non viene convertito.

Problemi correlati