2013-07-18 27 views
10

JSON'a özel nesnelerin listelerini sıralamak için spray-json kullanıyorum. Aşağıdaki vaka sınıfına ve JsonProtocol'una sahibim.spray-json ve liste sıralaması

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

bunun gibi bir rotada koymak deneyin:

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

Belki sorun ne biliyor:

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

Ben söyleyerek bir hata alıyorum?

Ben sprey 1.1-M7 ve sprey json ile Scala 2.10.1 kullanıyorum 1.2.5

+0

Bkz. [Bu örnek] (https://github.com/spray/spray/blob/master/examples/spray-client/simple-spray-client/src/main/scala/spray/examples/Main.scala), bir '' '' '' kullanır. – opyate

cevap

2

Ayrıca rota kapsamında tanımlanan biçimi almak gerekir:

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

İçeri aktarım var. ElementResponse türünde nesnelerin kuyruğu iyi çalışıyor. Çalışmayan şey, bu nesnelerin listelerini sıralamaktır. –

3

The bunu yapmanın en kolay yolu, listenizden bir dize yapmaktır yoksa ChunckedMessages ile uğraşmak gerekecek:

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

saniye yolu Stream[ElementResponse] listenizi dönüştürmek vesprey izin vermektirsizin için.

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

Bu güzel bir fikir ama json protokolümde marshaller'i nasıl kullanmalıyım? (Benim durumumda JollyJsonProtocol) - bu gizli yöntemi protokol sınıfına eklemek yardımcı olmuyor. –

+1

JollyJsonProtocol'unuzu yeniden adlandırmanızı ve [import tax] [2] için bir tamamlayıcı nesne olarak yapmanızı tavsiye ederim. Liste marshaller kapsam içine alarak çalışmalıdır. Stream’e gelince, listenizde 'toStream'’i çağırmanız yeterlidir. – 4lex1v

5

Bu eski bir konudur, ama benim 2c vermek gibi hissediyorum. Bugün benzer konulara bakıyordum.

Marcin, sorununuz gerçekten çözülmemiş gibi görünüyor (okuyabildiğim kadarıyla) - neden bir cevabı kabul ettiniz?

Buralarda import spray.json.DefaultJsonProtocol._ eklemeyi denediniz mi? Bunlar, Seq s, Map s, Option s ve Tuple s gibi şeyler yapmakla görevlidir. Bu sorunun sizin için bir sorun olabileceğini varsayalım, çünkü dönüştürülmeyen List.