私は、JSONオブジェクトのストリームをJSONオブジェクトの1つのストリームのストリームに変換するAkka Streams Flow
を実装しようとしています。私はConcat
を使用して、後に "["と "]"を追加し、Zip
の間にカンマを挿入することもできますが、最後のカンマを挿入しない方法はわかりません。akka-stream - フロー/グラフでストリームの最後の要素を別々に扱う方法
私がこれまで持っているコードは次のとおりです。
trait JsonStreamSupport {
protected def toJsonArrayString[T : Writes] = Flow[T].map(Json.toJson(_)).map(_.toString()).via(jsonArrayWrapper)
private[this] val jsonArrayWrapper: Flow[String, String, NotUsed] = Flow.fromGraph(GraphDSL.create() { implicit b =>
import GraphDSL.Implicits._
val start = Source.single("[")
val comma = Source.repeat(",")
val end = Source.single("]")
val concat = b.add(Concat[String](3))
val zip = b.add(Zip[String,String])
comma ~> zip.in1
start ~> concat.in(0)
zip.out.map({case (msg,delim) => msg + delim}) ~> concat.in(1)
end ~> concat.in(2)
FlowShape(zip.in0, concat.out)
})
}
現在の出力は次のようになります。
[{"key":"value},{"key","value"},]
が、私はそれが
[{"key":"value},{"key","value"}]
(最終カンマなし)、
する必要がある場所の各要素配列は依然としてストリームの別個の要素なので、たとえば、チャンクされたHTTPを別々に送信することができます。
パーフェクト、ありがとうございました! – Rag