10

カスタム オブジェクトのリストを JSON にマーシャリングするために、spray-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]]

おそらく、あなたは何が問題なのか知っていますか?

私はスプレー1.1-M7とスプレーjson 1.2.5でScala 2.10.1を使用しています

4

3 に答える 3

5

これは古い問題ですが、2c を与えたいと思います。今日も同様の問題を見ていました。

Marcin、あなたの問題は実際には解決されていないようです (私が読む限り) - なぜ 1 つの回答を受け入れたのですか?

場所に追加しようとしimport spray.json.DefaultJsonProtocol._ましたか?それらは、Seqs、Maps、Options、およびTuplesなどを機能させることを担当しています。List変換されていないのは であるため、これが問題の原因である可能性があると思います。

于 2015-06-30T14:23:23.910 に答える
3

これを行う最も簡単な方法は、リストから文字列を作成することです。そうしないと、ChunkedMessages を処理する必要があります。

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

2 番目の方法は、リストを に変換し、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 に答える