2013-07-18 45 views
10

Tôi đang sử dụng spray-json để sắp xếp các danh sách các đối tượng tùy chỉnh vào JSON. Tôi có lớp vỏ sau và JsonProtocol của nó.spray-json và danh sách 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) 
} 

Khi tôi cố gắng để đưa vào trong một con đường như thế này:

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

tôi nhận được một lỗi nói rằng:

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

Có lẽ bạn biết vấn đề là gì?

Tôi đang sử dụng Scala 2.10.1 với phun 1,1-M7 và phun json 1.2.5

+0

Xem [ví dụ này] (https://github.com/spray/spray/blob/master/examples/spray-client/simple-spray-client/src/main/scala/spray/examples/Main.scala), sử dụng '' 'List'''. – opyate

Trả lời

2

Bạn cũng cần phải nhập khẩu các định dạng mà bạn xác định trên phạm vi tuyến đường:

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

Tôi có tính năng nhập đó. Các đối tượng Marshalling loại ElementResponse hoạt động tốt. Những gì không làm việc là marshalling Danh sách các đối tượng đó. –

3

Các cách đơn giản nhất để làm điều này, là để thực hiện một string từ danh sách của bạn hoặc bạn sẽ phải đối phó với 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(",") 
     } 
    } 

cách giây là chuyển đổi danh sách của bạn vào Stream[ElementResponse] và để phun 01.232.nó cho bạn.

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

Đó là một ý tưởng hay, nhưng làm thế nào tôi nên sử dụng marshaller trong giao thức json của tôi? (JollyJsonProtocol trong trường hợp của tôi) - thêm phương thức ngầm này vào lớp giao thức không giúp được gì. –

+1

Tôi khuyên bạn nên đổi tên JollyJsonProtocol của bạn và biến nó thành một đối tượng đồng hành cho [thuế nhập khẩu] [2]. Danh sách marshaller nên hoạt động bằng cách nhập nó vào phạm vi. Đối với 'Stream', chỉ cần gọi' toStream' trong danh sách của bạn – 4lex1v

5

Đây là vấn đề cũ nhưng tôi cảm thấy thích 2c. Đã xem xét các vấn đề tương tự ngày hôm nay.

Marcin, có vẻ như vấn đề của bạn không thực sự được giải quyết (theo như tôi có thể đọc) - tại sao bạn chấp nhận một câu trả lời?

Bạn đã thử thêm import spray.json.DefaultJsonProtocol._ vào các địa điểm? Những người chịu trách nhiệm thực hiện những việc như Seq s, Map s, Option s và Tuple s để hoạt động. Tôi cho rằng đây có thể là nguyên nhân của vấn đề của bạn, vì đó là số List không được chuyển đổi.