akka-stream: cómo tratar el último elemento de una secuencia de manera diferente en un flujo / gráfico
Estoy tratando de implementar un Akka StreamsFlow
eso convertirá una secuencia de objetos JSON en una secuencia de una sola matriz de objetos JSON. Puedo usarConcat
para agregar un "[" antes y "]" después, así comoZip
para insertar comas entre elementos, pero no puedo entender cómo no insertar la coma final.
El código que tengo hasta ahora es:
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)
})
}
Actualmente el resultado es:[{"key":"value},{"key","value"},]
pero necesito que sea[{"key":"value},{"key","value"}]
(sin coma final),
donde cada elemento de la matriz sigue siendo un elemento distinto de la secuencia, por lo que se puede enviar, por ejemplo, a través de HTTP fragmentado por separado.