10

我正在使用 spray-json 将自定义对象列表编组为 JSON。我有以下案例类及其 JsonProtocol。

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

当我尝试输入这样的路线时:

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

我收到一条错误消息:

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

也许你知道问题出在哪里?

我正在使用带有 spray 1.1-M7 和 spray-json 1.2.5 的 Scala 2.10.1

4

3 回答 3

5

这是一个老问题,但我想给我的 2c。今天也在看类似的问题。

Marcin,您的问题似乎并没有真正解决(据我所知)-您为什么接受一个答案?

你试过import spray.json.DefaultJsonProtocol._在地方添加吗?那些负责使诸如Seqs,Maps,Options和Tuples之类的东西起作用。我认为这可能是您的问题的原因,因为它List没有被转换。

于 2015-06-30T14:23:23.910 回答
3

最简单的方法是从您的列表中创建一个字符串,否则您将不得不处理 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(",")
      }
    }

第二种方法是将您的列表转换为Stream[ElementResponse]并让喷雾为您分块。

get {
  complete {
    List(new ElementResponse(...), new ElementResponse(...)).toStream
  }
}
于 2013-07-19T07:40:11.450 回答
2

您还需要导入您在路由范围中定义的格式:

import JollyJsonProtocol._
get {
      complete {
        List(new ElementResponse(...), new ElementResponse(...))
      }
    }
于 2013-07-19T03:06:54.917 回答